码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-03-06 20:49:46      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:c++builder   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)

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

标签:c++builder   c++   property      面向对象   

原文地址:http://blog.csdn.net/sdragonx/article/details/44103737

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!