如何定义一个列表,它可以容纳c ++中不同类型的对象,就像python list一样?我尝试了以下代码
#include <iostream>
template< typename t >
struct Node {
t val;
Node *next;
};
int main() {
Node<int> a;
a.val = 1;
Node<char> b;
b.val = 'b';
a.next = &b;
b.next = NULL;
}
但是编译器给出以下错误:
main.cpp:14:15: error: cannot convert 'Node<char>*' to 'Node<int>*' in
assignment
a.next = &b;
^
答案 0 :(得分:0)
此代码有两个问题,首先是Node的下一个成员未定义模板类型,通常在这种情况下,如果您要创建一个通用类型的链表,则需要执行以下操作Node<t>* next
。第二个事实是您正在将似乎是Node *的分配给Node *。
如果您要创建的链表类型不同,则无法使用此方法。简而言之,原因是您必须传递t
参数的类型,因此每个节点都必须具有 defined 类型。模板类的目的不是允许用户随意分配任何泛型类型,而是通过允许您将类型作为参数传递来简化类的重复实现。例如:List<int>
与List<char>
与IntList
和CharList
的类简化了您的工作。
如果您想要在同一数组中存储任何动态分配的类型的行为,那么就不那么容易了。我建议您查看c ++ 17 std::any
和std::variant
类型,或者如果语言的旧版本是boost库中的boost boost::any
和boost::variant
类型。没有标准库的其他方法是使用多态性或void*
。