创建模板结构(C++)的std::列表
Create std::list of templated structs (C++)
我有一个结构定义如下:
template <typename T>
struct data {
int num;
T *ptr;
};
我想创建一个std::列表,列出使用不同类型的各种数据结构,如:
struct data<My_Favorite_Type> a;
struct data<My_Second_Favorite_Type> b;
我只是不确定是否可以声明一个同时接受这两种结构的std::list。创建一个std::列表是可能的吗?作为一种变通方法,我想我可以把我的结构做成一个通用链表,但如果可能的话,我真的只想使用std库。
存储在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
。
不,您想要做的事情是不可能的,但如果您使用boost::any
之类的东西,您可以做一些额外的工作。
详细的答案是"不,不可能"(非详细的答案太短)。
相关文章:
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 将std ::列表附加到std ::列表的向量中
- STD ::列表对其分配器参数有什么作用
- swig-包装到c#时,没有默认的std ::列表,我该怎么做
- 调用具有std ::列表为参数的C 函数
- STD ::列表和垃圾收集算法
- 低于20亿的质量 - 使用STD ::列表阻碍性能
- C 按其值对object的std ::列表进行排序
- 如何在(C )构造函数参数列表中包含std:列表
- 如何使用迭代器插入std ::列表
- C STD ::列表分割故障
- 将带有指针的 STD 列表复制到另一个带有指针的 STD 列表
- 比较std::对的2个std::列表
- 在 std 列表中查找对象并将其添加到另一个列表
- 与内存堆有关的C 链接列表(STD ::列表)是否使用新的
- 使用STD ::列表作为循环列表安全吗?
- C++当类型T需要构造函数时,是否可以创建类型T的std::列表
- 从对象指针的 STD 列表中擦除对象
- 如何从std::列表中删除项目
- 正在从std::unique_pointer的std::列表中删除元素