在其他語言中, 例如 C#或者 objective-c 中,均有屬性這語法.
下面就實現這語法功能.
思索
通常來說,一個屬性由 getter 和 setter 來進行讀和寫.其普通形式如下:<pre>void set_name(T val); T get_name();</pre> 我們定義一個宏:<pre>#define property(T, name) T get_##name(); void set_##name(T val)</pre> 實現了定義2個方法,來控制讀取.
可是這是2個函數啊.依然不像 C#一樣可以通過一個對象值來讀寫啊!
對象值,要怎么實現? 對象, 對象,即這是一個類 class!
類定義變量名,每個變量名稱不一樣,代表著不同的屬性名!
可問題又來了,不同屬性類型不一樣啊!
類型不一樣, C++ 就有專治這問題的解決方案! 模板!
屬性類模板
<pre>template<typename ClassName, typename T>
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;}
};</pre>
宏:
<pre>#define property(C, T, N) PropertyClass<C, T> N; T get_##N(); void set_##N(T val)
define set_property(C, N) N(this, &C::get_##N, &C::set_##N)</pre>
用法
<code>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; }</code>