自從離開學校就基本上不再使用C++了,最近卻又因為項目上的原因重新走入這一迷失的世界, 感覺很是缺乏一些順手的工具。首先就是做配置管理有點麻煩, 因為缺乏反射機制, 無法直接映射, 所以一般需要手工書寫配置設置功能.
我們希望配置類在配置階段能夠支持動態屬性名,
但是內部使用時支持直接的屬性訪問,便于編譯器檢查, 也提高運算速度。
所幸C++的類型系統能夠偷偷的去干很多見不得人的勾當,因此便有了下面這個簡易機制。
_variant_t是VC++在<comdef.h>中提供的對變體數據類型的封裝。使用S_P和G_P這樣的宏可以由編譯器檢查變量名的正確性。
我們希望配置類在配置階段能夠支持動態屬性名,
GConfig cfg;
cfg.set("bgColor.b",3.0);
cfg.set("lightEnabled",false);
t_float b = cfg.get("bgColor.b");
bool l = cfg.get("lightEnabled");
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;
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);
}
};
#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這樣的宏可以由編譯器檢查變量名的正確性。