再谈用c++实现property,不明白那些委员会是干嘛吃的。

参阅了一些文章,做了一个vc、cb、gcc通用的property声明宏函数,经cb和devcpp测试通过,release版本的效率没有损失。真不明白c++委员会是干嘛吃的,整天搞那个标准库,却不肯扩充基本功能。面向对象的类的三个操作:方法、属性、事件,其中属性就不肯提供编辑器支持标准,cb和vc多少年前就支持了,不是c++做不到,只是编程过程中,那些get()和set()之类的操作函数既不美观,书写也费劲,整体看起来,括号()太多了!

代码如下:

//property

#if defined(__BORLANDC__) || defined(_MSC_VER)
#define property_get_set(class, type, name, getter, setter)\
__declspec(property(get=getter, put=setter)) type name;
#define property_get(class, type, name, getter)\
__declspec(property(get=getter)) type name;
#define property_begin
#define property_end
#else //defined(__BORLANDC__) || defined(_MSC_VER)
//模拟的property是占用空间的 
#define property_get_set(class_t, type_t, name, getter, setter)\
class property_##name\
{\
public:\
friend class class_t;\
inline size_t offset(){return offsetof(class_t, name); }\
inline class_t* parent(){ return reinterpret_cast<class_t*>(size_t(this)-offset()); }\
template<typename T> inline operator T()\
{\
return T(parent()->getter());\
}\
inline property_##name & operator=(const type_t& n)\
{\
parent()->setter(n);\
return *this;\
}\
}name;


#define property_get(class_t, type_t, name, getter)\
class property_##name\
{\
public:\
friend class class_t;\
inline size_t offset(){ return offsetof(class_t, name); }\
inline class_t* parent(){ return reinterpret_cast<class_t*>(size_t(this)-offset()); }\
template<typename T>inline operator T()\
{\
return T(parent()->getter());\
}\
private:\
property_##name & operator=(const type_t& n);\
}name;


//把property放到一个union里面,可以有效减少类空间的占用 
#define property_begin union{
#define property_end };
#endif//defined(__BORLANDC__) || defined(_MSC_VER)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章