浏览 515 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-01-12
自从离开学校就基本上不再使用C++了,最近却又因为项目上的原因重新走入这一迷失的世界, 感觉很是缺乏一些顺手的工具。首先就是做配置管理有点麻烦, 因为缺乏反射机制, 无法直接映射, 所以一般需要手工书写配置设置功能.
我们希望配置类在配置阶段能够支持动态属性名, GConfig cfg;
cfg.set("bgColor.b",3.0); cfg.set("lightEnabled",false); t_float b = cfg.get("bgColor.b"); bool l = cfg.get("lightEnabled"); 但是内部使用时支持直接的属性访问,便于编译器检查, 也提高运算速度。 t_float b = cfg.bgColor.b;
bool l = cfg.lightEnabled; 所幸C++的类型系统能够偷偷的去干很多见不得人的勾当,因此便有了下面这个简易机制。 #define S_P(x) do{if(strcmp(name,#x) == 0) { x = value; return; } } while(0)
#define G_P(x) do{if(strcmp(name,#x) == 0) { value = x; return; } } while(0) class _GConfig{ public: bool lightEnabled; t_float minX; t_float maxX; t_float minY; t_float maxY; _GConfig(){ // initialize all primitive members memset(this,0,sizeof(_GConfig)); } }; class GConfig: public _GConfig{ public: GColor bgColor; GConfig(){ } _variant_t get(const char* name){ _variant_t value; get(name,value); return value; } void get(const char* name,_variant_t& value){ G_P(lightEnabled); G_P(minX); G_P(maxX); G_P(minY); G_P(maxY); G_P(bgColor.r); G_P(bgColor.g); G_P(bgColor.b); G_P(bgColor.a); } void set(const char* name, _variant_t value){ S_P(lightEnabled); S_P(minX); S_P(maxX); S_P(minY); S_P(maxY); S_P(bgColor.r); S_P(bgColor.g); S_P(bgColor.b); S_P(bgColor.a); } }; _variant_t是VC++在<comdef.h>中提供的对变体数据类型的封装。使用S_P和G_P这样的宏可以由编译器检查变量名的正确性。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
| 返回顶楼 | |
|
时间:2008-04-10
boost里已经有现成的啦!
|
|
| 返回顶楼 | |




