C ++ Как создать гетерогенный контейнер
-
13-09-2020 - |
Вопрос
Мне нужно хранить серию точек данных в виде (имя, значение), где значение может принимать разные типы.
Я пытаюсь использовать шаблон класса для каждой точки данных.Затем для каждой точки данных я вижу, я хочу создать новый объект и вернуть его обратно в вектор.Для каждого нового типа мне нужно сначала создать новый класс с шаблона.Но я не могу хранить объекты, созданные в любом векторе, так как векторы ожидают того же типа для всех записей.Типы, которые мне нужны для хранения, не могут быть установлены в иерархии наследования.Они не связаны.Также могут быть больше типов, созданных в будущем, и я не хочу менять службу хранения для каждого нового типа.Есть ли способ создать гетерогенный контейнер для хранения этих записей? Спасибо!
Решение
Библиотека Boost имеет, вероятно, что вы ищете (Boost :: любой).Вы можете катить свои собственные, используя обернутую подход указателя, если вы не можете использовать Boost ...
Другие советы
boost::any
уже рекомендован, однако это для чего-либо, поэтому вы не можете больше ожидать от этого.
Если вы знаете различные типы заранее, вы лучше используете boost::variant
.
typedef boost::variant<Foo, Bar, Joe> variant_type;
struct Print: boost::static_visitor<>
{
void operator()(Foo const& f) const { f.print(std::cout); }
template <class T>
void operator()(T const& t) const { std::cout << t << '\n'; }
};
void func(variant_type const& v) // not template
{
boost::apply_visitor(Print(), v); // compile-time checking
// that all types are handled
}
. Проблема с такими контейнерами, как это, когда вы хотите получить доступ к чему-то в контейнере, вы должны определить его тип, а затем бросить его на фактический тип.Это уродливая, неэффективно и ошибка, поэтому выбор № 1 в C ++ - использовать наследование, если у вас не очень хорошая причина не для - то, чего я никогда не сталкивался в моей карьере C ++.
Я думал, что вы просто можете иметь пару (тип, void *) и написать свою собственную функцию POP, которая отличает пустоту * в зависимости от типа, описывающую в паре, а затем засунуть их в любой контейнер. .