<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    C++配置管理

    Posted on 2008-01-12 20:58 canonical 閱讀(1803) 評論(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這樣的宏可以由編譯器檢查變量名的正確性。
    主站蜘蛛池模板: 亚洲欧洲日本精品| 久久精品国产亚洲AV麻豆网站| 久久精品国产亚洲AV久| 亚洲免费精彩视频在线观看| 亚洲精品成人片在线播放| 中文字幕无码免费久久9一区9 | 亚洲免费无码在线| 色视频在线观看免费| 亚洲精品麻豆av| 国产精品内射视频免费| 亚洲日韩av无码| 99re视频精品全部免费| 亚洲成aⅴ人片在线观| 成人片黄网站A毛片免费| 日本亚洲免费无线码| 啦啦啦www免费视频| 老司机午夜在线视频免费| 国产精品亚洲不卡一区二区三区| 国产免费久久精品99久久| 亚洲区小说区图片区QVOD| 久久免费视频99| 亚洲人成在线免费观看| 日韩激情无码免费毛片| 一区二区三区免费高清视频| 亚洲区小说区图片区QVOD| 18禁男女爽爽爽午夜网站免费| 亚洲中文字幕久在线| 日本高清免费网站| 中文字幕在线免费视频| 久久精品国产亚洲AV嫖农村妇女| 成人黄18免费视频| 一级成人a免费视频| 亚洲自偷自偷精品| 日本免费人成黄页网观看视频| 久久久久久av无码免费看大片| 日木av无码专区亚洲av毛片| 在线免费视频一区| 永久免费av无码网站yy| 亚洲精品自偷自拍无码| 亚洲精品夜夜夜妓女网| 成人人观看的免费毛片|