std::pair
и std::tuple
вряд ли являются контейнерами C ++ .... так что нет, в STL нет гетерогенных контейнеров, потому что нет необходимости иметь их встроенными.
Есть несколькоПодходит для создания таких контейнеров.Подходы, которые я бы порекомендовал:
- с использованием полиморфизма
- с использованием типа варианта
Для полиморфизма вы можете выбрать BoostКонтейнер указателя library.
boost::ptr_vector<Base> vec;
vec.push_back(new Derived);
vec.push_back(new Derived2);
Он имитирует контейнеры STL, но предоставляет функции, ориентированные на полиморфизм:
- Доступ к элементам как
Base&
- Автоматическая обработка памяти
- Специфическое поведение копирования (с использованием
new_clone
методов) - Синтаксический сахар: дано
boost::ptr_vector<Base>::iterator it;
, *it
является Base&
Если ваши типы не связаны, другой возможностью является использование Boost Variant .По сути, вариант похож на:
enum { Type1, Type2, ... } _type;
union {
SomeType1 _1;
SomeType2 _2;
...
} _u;
Конечно, поскольку он ускорен, он предоставляет конкретные гарантии того, что вы сможете получить доступ только к члену объединения, которое в данный момент активно и снимает ограничение наклассы с конструкторами / деструкторами, которые не могут быть использованы в традиционных объединениях.
Он также предоставляет средства, такие как static_visitor
, который эквивалентен переключателю типа, и выдаст ошибку компиляции, если один извозможные состояния не посещаются.