【发布时间】:2010-10-29 17:05:21
【问题描述】:
我正在做一些看起来可以改进的事情,但我没有足够的技能来改进它。你能帮忙吗?
给定:
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是实现工厂模式的好方法。 -
你说得对,我不知道容器包含什么,但我知道它可能包含的所有可能值。因此,如果 MetaData 是带有 A、B、C 的枚举。我知道这些是可能性,但是,我可能只得到 A 和 C。
标签: c++