C++에서 프로퍼티 구현하기 #


C++에서 템플릿을 이용한 프로퍼티를 구현한 소스입니다.
VC++에서는 프로퍼티를 컴파일러 차원에서 지원하지만 이건 ANSI 코드입니다.

출처는 BorlandForum 이고 보다 안정적이게 소스를 수정했습니다.

#ifndef __PROP_H__BY_CDECL__ 
#define __PROP_H__BY_CDECL__ 

namespace Glass {

class IYES {};
class YES : public IYES {};
class NO {};

template <class T, class Parent, class ReadWrite = YES>
    class Prop
{
public:
    typedef Prop<T, Parent> this_type;
    typedef T (Parent::*get_fun)();
    typedef void (Parent::*set_fun)(const T&);

    Prop() : getf_(NULL), setf_(NULL), parent_(NULL) {}

    void SetParent(Parent *p) {
        parent_ = p;
    }

    void Set(set_fun f) {
        ReadWrite yn;
        IYES *p = &yn; // 읽기전용일때 이함수를 사용하면 컴파일 에러 !! 

        setf_ = f;
    }

    void Get(get_fun f) {
        getf_ = f;
    }

    T operator=(const T &value) {
        ReadWrite yn;
        IYES *p = &yn; // 읽기전용일때 이함수를 사용하면 컴파일 에러 !! 

        if (!setf_) {
            throw exception();
        }

        (parent_->*setf_)(value);
        return value;
    }

    T operator=(this_type &type) {
        return operator=(static_cast<T>(type));
    }

    operator T() {
        if (!getf_) {
            throw exception();
        }

        return (parent_->*getf_)();
    }

private:
    Parent *parent_;
    get_fun getf_;
    set_fun setf_;

};


} // namespace Glass 

#endif // __PROP_H__BY_CDECL__ 



#include <iostream>
#include <string>
using namespace std;


class AA
{
public:
    AA() {
        Str.SetParent(this);
        Str.Set(&AA::setStr);
        Str.Get(&AA::getStr);
    }

    void setStr(const string &str)
    {
        cout << "setStr" << endl;
        str_ = str;
    }

    string getStr()
    {
        cout << "getStr" << endl;
        return str_;
    }

    Glass::Prop<string, AA> Str;
    string str_;
};


int main()
{
    AA a;
    a.Str = "cdecl ";

}

'Dev > C++' 카테고리의 다른 글

memory pooling - code  (0) 2008.05.01
Is Derived - code  (0) 2008.05.01
boost::pool 예제  (0) 2008.05.01
STLport 초간단 설치  (1) 2008.05.01
Stroustrup - The real interview  (0) 2008.05.01

+ Recent posts