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

          C++配置管理

          Posted on 2008-01-12 20:58 canonical 閱讀(1796) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 軟件開(kāi)發(fā)
            自從離開(kāi)學(xué)校就基本上不再使用C++了,最近卻又因?yàn)轫?xiàng)目上的原因重新走入這一迷失的世界, 感覺(jué)很是缺乏一些順手的工具。首先就是做配置管理有點(diǎn)麻煩, 因?yàn)槿狈Ψ瓷錂C(jī)制, 無(wú)法直接映射, 所以一般需要手工書(shū)寫(xiě)配置設(shè)置功能.
            我們希望配置類(lèi)在配置階段能夠支持動(dòng)態(tài)屬性名,
            GConfig cfg;
            cfg.set(
          "bgColor.b",3.0);
            cfg.set(
          "lightEnabled",false);

            t_float b 
          = cfg.get("bgColor.b");
            bool l 
          = cfg.get("lightEnabled");

              但是內(nèi)部使用時(shí)支持直接的屬性訪問(wèn),便于編譯器檢查, 也提高運(yùn)算速度。
                  t_float b = cfg.bgColor.b;
                  bool l 
          = cfg.lightEnabled;


          所幸C++的類(lèi)型系統(tǒng)能夠偷偷的去干很多見(jiàn)不得人的勾當(dāng),因此便有了下面這個(gè)簡(jiǎn)易機(jī)制。

          #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>中提供的對(duì)變體數(shù)據(jù)類(lèi)型的封裝。使用S_P和G_P這樣的宏可以由編譯器檢查變量名的正確性。
          主站蜘蛛池模板: 沁源县| 凌源市| 淮北市| 崇明县| 西城区| 金山区| 阿尔山市| 宝山区| 珲春市| 宣武区| 巴南区| 民权县| 万载县| 印江| 大埔县| 象山县| 咸阳市| 宜兴市| 永胜县| 印江| 昌图县| 呼图壁县| 赣榆县| 海南省| 久治县| 彰武县| 利川市| 中宁县| 额济纳旗| 溆浦县| 光山县| 舟山市| 洪泽县| 饶河县| 天台县| 离岛区| 宜良县| 平江县| 郓城县| 泰兴市| 洱源县|