我的结构定义如下:
template <typename T>
struct data {
int num;
T *ptr;
};
我想创建一个使用不同类型的各种数据结构的std :: list,如:
struct data<My_Favorite_Type> a;
struct data<My_Second_Favorite_Type> b;
我只是不确定是否可以声明一个接受这两个结构的std :: list。是否可以创建这些std :: list?作为一种解决方法,我认为我可以将我的结构化为通用链表,但我真的很想只使用std库。
答案 0 :(得分:2)
存储在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 :(得分:1)
不,你想做的事情是不可能的,但如果你使用像boost::any
这样的东西,你可以通过一些额外的工作来实现目标。
答案 2 :(得分:0)
冗长的答案是“不,这是不可能的”(并且非冗长的答案太短了。)