У меня есть класс:
class A
{
public:
virtual void func() {...}
virtual void func2() {...}
};
И некоторые производные классы из этого, скажем, B, C, D... В 95% случаев я хочу пройти через все объекты и вызвать func или func2(), поэтому поэтому я их в вектор, например:
std::vector<std::shared_ptr<A> > myVec;
...
for (auto it = myVec.begin(); it != myVec.end(); ++it)
(*it).func();
Однако в остальных 5% случаев я хочу сделать что-то другое для классов в зависимости от их подкласса. И я имею в виду совершенно разные, такие как функции вызова, которые принимают другие параметры или вообще не вызывают функции для некоторых подклассов. Я подумал о некоторых вариантах решения этого вопроса, никому из которых мне очень нравится:
- Используйте dynamic_cast для анализа подкласса. Не очень хорошо, слишком медленно, поскольку я делаю звонки очень часто и на ограниченном оборудовании.
- Используйте флаг в каждом подклассе, например enum {IS_SUBCLASS_B, IS_SUBCLASS_C}. Нехорошо, так как он не чувствует OO.
-
Также поместите классы в другие векторы, каждый из которых выполняет свою конкретную задачу. Это тоже не очень хорошо, но, возможно, я здесь неправ. Как:
std::vector<std::shared_ptr<B> > vecForDoingSpecificOperation; std::vector<std::shared_ptr<C> > vecForDoingAnotherSpecificOperation;
Итак, может кто-нибудь предложить стиль/шаблон, который достигает того, что я хочу?