Вопрос

Мне нужно хранить серию точек данных в виде (имя, значение), где значение может принимать разные типы.

Я пытаюсь использовать шаблон класса для каждой точки данных.Затем для каждой точки данных я вижу, я хочу создать новый объект и вернуть его обратно в вектор.Для каждого нового типа мне нужно сначала создать новый класс с шаблона.Но я не могу хранить объекты, созданные в любом векторе, так как векторы ожидают того же типа для всех записей.Типы, которые мне нужны для хранения, не могут быть установлены в иерархии наследования.Они не связаны.Также могут быть больше типов, созданных в будущем, и я не хочу менять службу хранения для каждого нового типа.Есть ли способ создать гетерогенный контейнер для хранения этих записей? Спасибо!

Это было полезно?

Решение

Библиотека 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, которая отличает пустоту * в зависимости от типа, описывающую в паре, а затем засунуть их в любой контейнер. .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top