Вы можете использовать C ++ 17's std::any
, std::variant
или определить свой собственный тип объекта:
Stack<std::variant<int, double, char>> obj_stack(size);
Если Stack
имеет интерфейс, подобный std::vector
, тогда использование будет выглядеть следующим образом:
obj_stack.push_back(12);
std::cout << std::get<int>(obj_stack.back()) << '\n';
obj_stack.push_back('x');
std::cout << std::get<char>(obj_stack.back()) << '\n';
Кроме того, посмотрите вверх std::holds_alternative
, std::get_if
и std::visit
.Они могут помочь вам определить, к какому типу относится ваш элемент, и действовать соответственно.
Если C ++ 17 невозможен, то можно использовать boost::variant
Если ни Boost, ни C ++ 17 не являются опцией, вы всегда можете определить собственную иерархию классов для хранения различных типов.Но в этом случае вы, скорее всего, заново изобретаете std::any
и std::variant
, что не является хорошей идеей (если ваша цель не состоит в том, чтобы узнать, как эти вещи могут быть реализованы).