再谈用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)

时间: 2024-10-08 06:41:30

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

Java基础——再谈面向对象

去年的这个时候,心血来潮写了篇<简述面向对象技术>,先在看来不由的会想:这都是写的什么跟什么啊?(ps:虽然现在写的博客依然不咋地)但是,Java的学习中又一次不得不再一次面向对象,所以,奉上一篇<再谈面向对象>,做为新年的一盘开胃菜. 面向对象是相对于面向过程而言,是一种思想. 区别于面向过程: 面向过程是以函数为基础,完成各种操作,强调的是过程,而面向对象是以对象为基础,强调的是对象. 比如说把大象装进冰箱分为几步,宋丹丹是这样说的:三步呗, 第一步:打开冰箱门, 第二步:把大

从飞信群再谈时间管理

收邮件啊 快收邮件~取消飞信小群的当天晚上,便有几位小组组长跑到某某那如是说.虽然我没有做过调查,但是看到这样的情景,我想她们应该和我有一样的感觉,没有了飞信小群在一定程度上,不 -方 -便- 但是过了这一段时间之后,发现我们日常的学习并没有受到什么影响,反倒是比之前明显的改善了.下面谈谈我对这件事的看法. 首先我们还是有飞信大群的.因为不会经常通知,也就谈不上打扰,而且也保证了紧急情况下的及时性和效率.可小群不一样.小群的人数不多,但通知频繁.这样问题就随之来了.最近我的体会 优点一减少打扰

【Go语言】【13】再谈GO语言的结构体

本文从如下四个方面再领着大家认识结构体 匿名结构体和匿名成员的结构体 值传递和引用传递 再谈嵌套结构体 面向对象 1.匿名结构体和匿名成员的结构体 如上篇所述,一个结构体需要先声明,再初始化,最后把初始化后的结构体赋值给其它变量,例如: /*声明结构体*/ type employee struct{ name,address string height,weight float64 } /*初始化结构体,并赋给变量emp*/ emp := employee{name:"eagle",

沉淀再出发:再谈java的多线程机制

沉淀再出发:再谈java的多线程机制 一.前言 自从我们学习了操作系统之后,对于其中的线程和进程就有了非常深刻的理解,但是,我们可能在C,C++语言之中尝试过这些机制,并且做过相应的实验,但是对于java的多线程机制以及其中延伸出来的很多概念和相应的实现方式一直都是模棱两可的,虽然后来在面试的时候可能恶补了一些这方面的知识,但是也只是当时记住了,或者了解了一些,等到以后就会变得越来越淡忘了,比如线程的实现方式有两三种,线程池的概念,线程的基本生命周期等等,以及关于线程之间的多并发引起的资源的抢占

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_74_面向对象编程 --再谈文本查询示例[续/习题]

面向对象编程 --再谈文本查询示例[续/习题] //P522 习题15.41 //1 in TextQuery.h #ifndef TEXTQUERY_H_INCLUDED #define TEXTQUERY_H_INCLUDED #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <set> #include <map&g

再谈MySQL全库备份

再谈MySQL全库备份 简介 Part1:写在最前 在很早之前,我写过一个MySQL生产库全库备份脚本,今天有同事问我是不是要再加一个-R参数来备份存储过程,理由的话是由于mysqldump --help中 关于存储过程的默认备份是false. routines                          FALSE MySQL生产库全库备份脚本 http://suifu.blog.51cto.com/9167728/1758022 实战 Part1:写在最前 我备份一般就三个参数 --s

Android 再谈handler

今天在做http网络事件的响应网络接收处理一般不能放在主线程中使用,目前也只会使用AsyncTask进行处理!之前虽然写过handler处理的一些文章但是发现全不会了!无奈~ 关于handler某位兄弟已经整理的很透彻了!现在引用下原话如下: Handler监听者框架:子线程是事件源,主线程是监听者.Handler作为子线程的监听器出现:主线程中生成Handler的子类,并重写handleMessage(Message msg) 方法,用来对子线程响应.子线程调用Hanlder的sendMess

再谈ORACLE CPROCD进程

罗列一下有关oprocd的知识点 oprocd是oracle在rac中引入用来fencing io的 在unix系统下,如果我们没有采用oracle之外的第三方集群软件,才会存在oprocd进程 在linux系统下,只有在10.2.0.4版本后,才会具有oprocd进程 在window下,不会存在oprocd 进程,但是会存在一个oraFenceService服务,用来实现相同的功能,该服务采用的技术是基于windows的,与oprocd不同 oprocd进程可以运行在两者模式下:fatal和n