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這樣的宏可以由編譯器檢查變量名的正確性。
          主站蜘蛛池模板: 满城县| 南丰县| 洮南市| 会同县| 焦作市| 甘泉县| 伊宁市| 九台市| 罗田县| 从江县| 腾冲县| 图木舒克市| 丰城市| 金山区| 萝北县| 霞浦县| 兰溪市| 呼伦贝尔市| 曲松县| 保靖县| 蚌埠市| 油尖旺区| 志丹县| 诏安县| 花莲市| 上栗县| 昌江| 大田县| 正宁县| 内黄县| 南靖县| 巴南区| 临海市| 汝州市| 安多县| 墨脱县| 阜城县| 墨江| 开鲁县| 蚌埠市| 五原县|