我正在做一些似乎可以改进的事情,但是我没有足够的技巧来改进它。你能帮我吗?

鉴于:

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语句很糟糕,因为在编译时所有枚举值都是已知的,因此从理论上讲我们已经知道将什么类型放入 vector 中。但是我们在运行时这样做。

没有为此编写代码生成器,有没有更好的方法?

最佳答案

并不是的。但是,您可以使用factory type提取大部分样板,并使用boost::ptr_vector或智能指针容器以智能方式管理资源。 (See comments关于智能指针与哑指针的智能指针之间的选择。)

关于c++ - 更好的方法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4054206/

10-12 16:31