2

我有一个定义如下的结构:

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

4

3 回答 3

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.

于 2012-01-26T20:10:28.400 回答
1

不,您想要做的事情是不可能的,但是如果您使用类似boost::any.

于 2012-01-26T19:55:48.237 回答
0

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

于 2012-01-26T19:54:01.273 回答