论坛首页 编程语言技术论坛

C++配置管理

浏览 3336 次
锁定老帖子 主题:C++配置管理
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-01-12   最后修改:2008-11-23
C++

  自从离开学校就基本上不再使用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这样的宏可以由编译器检查变量名的正确性。

   发表时间:2008-04-10  
boost里已经有现成的啦!
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics