C++属性の実現

1494 ワード

他の言語、例えばC#やobjective-cには、属性という文法がある.以下、この文法機能を実現する.
思索する
通常、1つの属性はgetterとsetterによって読み書きされる.その一般的な形式は以下の通りである:
void set_name(T val); T get_name();
マクロを定義:
#define property(T, name) T get_##name(); void set_##name(T val)
定義2つの方法を実現し、読み取りを制御する.しかし、これは2つの関数ですね.依然としてC#のように1つのオブジェクト値で読み書きできるわけではありません!オブジェクト値、どのように実現しますか?オブジェクト、オブジェクト、すなわちクラスclassです!クラス定義変数名は、変数名ごとに異なり、異なる属性名を表します.しかし、問題はまた来て、異なる属性のタイプは違います!タイプが違うと、C++はこの問題を解決するソリューションがあります!テンプレート!
属性クラステンプレート
template
class PropertyClass{
public:
typedef T(ClassName::*GetterType)();
typedef void (ClassName::*SetterType)(T val);
private:
ClassName* obj;
GetterType getter;
SetterType setter;
public:
explicit PropertyClass(ClassName* o, GetterType g, SetterType s) : obj(o), getter(g), setter(s){}
operator T(){return (obj->*getter)();}
PropertyClass& operator=(T val) { (obj->*setter)(val); return *this;}
};

マクロ:
#define property(C, T, N) PropertyClass N; T get_##N(); void set_##N(T val) 
 

define set_property(C, N) N(this, &C::get_##N, &C::set_##N)


使用法class A
{
int _age;
public:
property(A, int, age);
A();
};
A::A() : set_property(A, age){}
int A::get_age() { return _age; }
void A::set_age(int a) { _age = a; }