存储在 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
.