再谈用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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值