具有不同元素的链表,可能吗?

M3t*_*0it 5 c++

海亚,

让我解释一下我的观点。

template<typename T>
class node{
  T data;
  template<typename X>
  node<X>* right; // can point to any node<typename> i know its wrong
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以做类似的事情:

node<int> a;
a.data = 23;
node<float> b;
b.data =43.6;
a.right= b;
std::cout<< a.data <<a.right->data;
Run Code Online (Sandbox Code Playgroud)

另一个例子:

template <class Type>
struct vnode {
  Type data;
  vnode<Type> * vnodenext;
  // vrow what_to_put_here // **i don't want to use void ptrs neither want to cast back manually**
}
Run Code Online (Sandbox Code Playgroud)

在 main 函数中,如果我定义了vnode类型的结构stringvnode类型的另一个结构,那么我应该在结构定义中int替换什么指针 def ,以便它可以指向类型或其他类型?例如vrowvnodevnodeintvnode

vnode<string> mystring;
vnode<int> myint;

myint.vrow = &mystring
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 4

实际上不可能做你想做的事,因为使用模板时你必须知道编译时涉及的类型。相反,遍历先前构建的链表需要您在运行时发现列表中的类型

为了说明这一点,请考虑以下情况:

struct node_base {
    virtual ~node_base() {}
}

template<typename T>
struct node : public node_base {
    T data;
    node_base* right;
}
Run Code Online (Sandbox Code Playgroud)

现在您当然可以拥有 的列表node_base*,并且这些节点可以包含您想要的任何类型的数据。构造列表不是问题,因为在添加节点时, 的静态类型data是已知的,并且您可以创建一个node<TData>.

现在的问题是如何取回数据。假设有一个函数返回节点内的数据,给定一个指向该节点的指针。函数的返回类型应该是什么?显然(除非您事先知道所有数据类型共享一个共同的基础)没有可以返回的单一类型。这给你留下:

  1. 返回一个void*
  2. 编写一个接收数据类型作为参数的模板化函数

然而,#2 在实践中并不可行(尽管它在理论上有效)。您不能将数据类型编写为模板参数,因为这需要您在编译时知道它,这违背了多数据类型列表的目的。

因此,剩下的唯一解决方案是返回一个指针类型(anode_base*或 avoid*到数据本身),然后使用某种机制将该指针转换为有用的类型。