gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:17:49 26 4
gpt4 key购买 nike

你好,

让我解释一下我的观点。

template<typename T>
class node{
T data;
template<typename X>
node<X>* right; // can point to any node<typename> i know its wrong
}

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

node<int> a;
a.data = 23;
node<float> b;
b.data =43.6;
a.right= b;
std::cout<< a.data <<a.right->data;

另一个例子:

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**
}

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

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

myint.vrow = &mystring

最佳答案

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

为了说明这一点,考虑一下:

struct node_base {
virtual ~node_base() {}
}

template<typename T>
struct node : public node_base {
T data;
node_base* right;
}

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

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

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

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

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

关于c++ - 具有不同元素的链表,可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5841903/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com