Я делаю то, что кажется, что его можно улучшить, но у меня нет достаточных навыков для его улучшения. Вы можете помочь?лучший способ сделать это?
Дан:
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;
}
Я чувствую, как заявление переключателя плохо, потому что во время компиляции всех значений перечислений известны, так что теоретически мы уже знаем, какие типов должны пойти в векторе материал. Но мы делаем это во время выполнения.
Коротко писать генератор кода для этого, есть ли лучший способ?
«во время компиляции все значения перечисления известны» - вы имеете в виду, что знаете содержимое «metaDataContainer»? Это не выглядит так. И 'switch' - это достойный способ реализации фабричного шаблона. – aschepler
Вы правы, я не знаю, что содержит контейнеры, но я знаю все возможные значения, которые он может содержать. Поэтому, если MetaData - это перечисление с A, B, C. Я знаю, что это возможности, но я мог бы просто получить A и C. – anio