我正在做一些似乎可以改進的東西,但我沒有足夠的技能來改進它。你能幫我嗎?更好的方法來做到這一點?
考慮:
vector<Base*> stuff;
const vector<MetaData>& metaDataContainer = Config.getMetaData();
for(vector<MetaData>::const_iterator i = metaDataContainer.begin(), end = metaDataContainer.end(); i != end; ++i)
{
Base* pCurrent = buildDerivedType(*i);
stuff.push_back(pCurrent);
}
Base* buildDerivedType(MetaData meta)
{
Base* pRetval = NULL;
switch(meta)
{
case MetaData::A:
pRetval = new Alpha();
break;
case MetaData::B:
pRetval = new Beta();
break;
//so on so forth
};
return pRetval;
}
我覺得switch語句是不好的,因爲在編譯時所有的枚舉值是已知的,所以理論上我們已經知道是什麼類型需要進入矢量的東西。但我們在運行時會這樣做。
爲此編寫代碼生成器的缺點,有沒有更好的方法?
「在編譯時所有的枚舉值被稱爲」 - 你的意思是,你知道metaDataContainer'的'的內容?它看起來並不那樣。而'switch'是實現工廠模式的體面方式。 – aschepler 2010-10-29 17:13:52
你是對的,我不知道容器包含什麼,但我知道它可能包含的所有可能的值。所以如果MetaData與A,B,C聯繫在一起,我知道那些是可能性,但是,我可能只會得到A和C. – anio 2010-10-29 17:16:31