Создать std :: список шаблонных структур (C ++) - PullRequest
2 голосов
/ 26 января 2012

У меня есть структура, определенная следующим образом:

template <typename T> 
struct data {
  int num;
  T *ptr;
};

Я хочу создать std :: список различных структур данных, используя различные типы, такие как:

struct data<My_Favorite_Type> a;
struct data<My_Second_Favorite_Type> b;

I'mпросто не уверен, возможно ли объявить std :: list, который принимает обе эти структуры.Возможно ли создание std :: list из них?В качестве обходного пути я думаю, что я мог бы просто превратить мою структуру в общий связанный список, но я бы очень хотел просто использовать библиотеку std, если это вообще возможно.

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Типы, хранящиеся внутри контейнеров std, должны быть одинаковыми. Так что вы не можете сделать это:

std::list<data> some_data;
some_data.push_back(data<int>());
some_data.push_back(data<float>());

Иногда просто иметь два списка - правильное решение. :)

Есть несколько альтернативных способов осмыслить проблему, хотя трудно сказать, подходят ли они вам.

Они могут быть указателями и обрабатываться динамически. В этом примере на самом деле не имеет значения, что это за данные, мы просто хотим их напечатать.

struct base {
  virtual ~base() {}
  virtual void print() const = 0;
};

template<typename T>
  struct data : public base {
    virtual void print() const {std::cout << num << std::endl;}
    int num;
    T *ptr;
  };

std::list<base *> some_data;

Вы также можете использовать boost::variant.

typedef boost::variant<
    data<int>
    ,data<float>
  > data_variant;

std::list<data_variant> some_data;

Другой инструмент, который делает варианты приятнее - boost::static_visitor.

1 голос
/ 26 января 2012

Нет, то, что вы хотите сделать, невозможно, но вы можете получить немного дополнительной работы, если будете использовать что-то вроде boost::any.

0 голосов
/ 26 января 2012

Многословный ответ: «Нет, это невозможно» (а не многословный слишком короткий для ответа).

...