C ++ не поддерживает гетерогенные контейнеры.
Если вы не собираетесь использовать boost
, взломать создание фиктивного класса и получить все разные классы из этого фиктивного класса. Создайте контейнер по вашему выбору для хранения фиктивных объектов класса, и вы готовы к работе.
class Dummy {
virtual void whoami() = 0;
};
class Lizard : public Dummy {
virtual void whoami() { std::cout << "I'm a lizard!\n"; }
};
class Transporter : public Dummy {
virtual void whoami() { std::cout << "I'm Jason Statham!\n"; }
};
int main() {
std::list<Dummy*> hateList;
hateList.insert(new Transporter());
hateList.insert(new Lizard());
std::for_each(hateList.begin(), hateList.end(),
std::mem_fun(&Dummy::whoami));
// yes, I'm leaking memory, but that's besides the point
}
Если вы собираетесь использовать boost
, вы можете попробовать boost::any
. Здесь - пример использования boost::any
.
Вы можете найти эту превосходную статью от двух ведущих специалистов по C ++.
Теперь, boost::variant
- это еще одна вещь, на которую стоит обратить внимание, как упоминалось j_random_hacker Итак, вот сравнение , чтобы получить четкое представление о том, что использовать.
С boost::variant
приведенный выше код будет выглядеть примерно так:
class Lizard {
void whoami() { std::cout << "I'm a lizard!\n"; }
};
class Transporter {
void whoami() { std::cout << "I'm Jason Statham!\n"; }
};
int main() {
std::vector< boost::variant<Lizard, Transporter> > hateList;
hateList.push_back(Lizard());
hateList.push_back(Transporter());
std::for_each(hateList.begin(), hateList.end(), std::mem_fun(&Dummy::whoami));
}