Posted on 2008-01-12 20:58
canonical 閱讀(1794)
評(píng)論(0) 編輯 收藏 所屬分類:
軟件開(kāi)發(fā)
自從離開(kāi)學(xué)校就基本上不再使用C++了,最近卻又因?yàn)轫?xiàng)目上的原因重新走入這一迷失的世界, 感覺(jué)很是缺乏一些順手的工具。首先就是做配置管理有點(diǎn)麻煩, 因?yàn)槿狈Ψ瓷錂C(jī)制, 無(wú)法直接映射, 所以一般需要手工書(shū)寫配置設(shè)置功能.
我們希望配置類在配置階段能夠支持動(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++的類型系統(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ù)類型的封裝。使用S_P和G_P這樣的宏可以由編譯器檢查變量名的正確性。