templates - c++模板链表,可以保存任何类型
问题描述
如何在 C++ 中定义一个可以容纳不同类型对象的列表,就像 python 列表一样?我尝试了以下代码
#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;
^
解决方案
这段代码有几个问题,首先是 Node 的下一个成员没有定义模板类型,通常在这种情况下,如果你想创建一个泛型类型的链表,你会做类似Node<t>* next
. 其次是您将看似 Node* 的内容分配给 Node*。
如果您要做的是创建一个不同类型的链接列表,那么您不能这样做。简单地说,原因是你必须为t
参数传入一个类型,因此每个节点都必须有一个定义的类型。模板类的目的不是让用户随意分配任何泛型类型,而是通过允许您将类型作为参数传递来简化类的重复实现。举个例子:a List<int>
vs aList<char>
让你不必创建一个IntList
类和一个CharList
类。
如果您想要在同一个数组中存储任何动态分配的类型的行为,那么这并不容易。我建议查看 c++17std::any
和std::variant
类型,或者如果是旧版本的语言,请查看 boost 库中的 boostboost::any
和boost::variant
类型。没有标准库的其他方法是使用多态性或void*
.
推荐阅读
- c - 切换二叉树子树 SIGSEV
- awk - 在 bash 脚本中使用 awk 实现 vlookup 功能
- c# - Linq Query 多个表加入不同表名的数组
- python - 错误显示:无法在 Termux 上找到包 python
- javascript - D3 - 当树加载时使链接与节点一起流动
- python - 字符串列出python转换
- tensorflow - keras 模型达到几乎 100% 的验证准确率,但预测总是返回 1
- html - 如何将一个元素放置在左右浮动的 2 个元素的底部?
- eclipse - macOS Catalina 的 Eclipse 升级
- java - 如何在java中验证下载的xml文件的数字签名