posts - 176, comments - 240, trackbacks - 0, articles - 7

C++配置管理

Posted on 2008-01-12 20:58 canonical 阅读(1768) 评论(0)  编辑  收藏 所属分类: 软件开发
  自从离开学校就基本上不再使用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这样的宏可以由编译器检查变量名的正确性。

只有注册用户登录后才能发表评论。


网站导航: