Типы, хранящиеся внутри контейнеров 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
.