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

          C++配置管理

          Posted on 2008-01-12 20:58 canonical 閱讀(1796) 評論(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這樣的宏可以由編譯器檢查變量名的正確性。
          主站蜘蛛池模板: 张家口市| 明水县| 习水县| 濮阳市| 香港| 墨竹工卡县| 赤壁市| 眉山市| 保亭| 吐鲁番市| 青神县| 济宁市| 永新县| 福建省| 平遥县| 贡觉县| 洪湖市| 临沂市| 科技| 荣成市| 高台县| 金寨县| 大荔县| 博野县| 阿拉善右旗| 金溪县| 海口市| 长白| 陵川县| 临安市| 九江县| 岳阳市| 南溪县| 会宁县| 中超| 石棉县| 柳江县| 长垣县| 黄石市| 抚州市| 永靖县|