创建std :: templated结构列表(C ++)

时间:2012-01-26 19:51:57

标签: c++ templates struct stdlist

我的结构定义如下:

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库。

3 个答案:

答案 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)

冗长的答案是“不,这是不可能的”(并且非冗长的答案太短了。)