再談用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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章