在其他语言中, 例如 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>