创建模板结构(C++)的std::列表

Create std::list of templated structs (C++)

本文关键字:std 列表 C++ 建模 结构 创建      更新时间:2023-10-16

我有一个结构定义如下:

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之类的东西,您可以做一些额外的工作。

详细的答案是"不,不可能"(非详细的答案太短)。