C++类中链表节点的多种数据类型
Posted
技术标签:
【中文标题】C++类中链表节点的多种数据类型【英文标题】:Multiple data types of Linked List nodes in class C++ 【发布时间】:2021-11-10 20:06:34 【问题描述】:我想在链表中创建一个节点,数据有多种类型(例如:int、string)。
所以我首先想到的是模板。
header file
template <typename T>
class SymbolTable
struct Node
string id;
T data;
Node *next;
;
public:
void insert(string id, string dataType); // I intend to use "dataType" to deduce type of data in Node struct
cpp file
template<typename T>
void SymbolTable<T>::insert(string id, string dataType)
Node *traverser = &(this->head);
while (traverser->next != nullptr) // Insert at the end of Linked List
traverser = traverser->next;
Node *newNode = new Node();
newNode->id = id;
newNode->next = nullptr;
traverser->next = newNode;
// I don't know how to use "dataType" to deduce the type of data in Node struct
然后在main.cpp
,它说
SymbolTable *st = new SymbolTable(); // cannot deduce class template arguments <-- I don't want this
还有没有办法
在cpp file
中使用变量 + 条件推断数据类型(例如:如果 dataType == "number" 然后推断 T -> int)?
摆脱main.cpp
中的“无法推断类模板参数”?
P/S:
除了string
之外没有外部库
main.cpp
中的文件无法修改
【问题讨论】:
现在,您已经编写了一个类模板。SymbolData<int>
是这个模板的一个实例,它将包含int
s。 SymbolData<std::string>
将是一个不同的实例化,它的节点将包含 std::string
s。您是否正在尝试创建一个数据结构,其中单个 SymbolTable
可以包含多个不同的节点,每个节点具有不同的数据类型?
@NathanPierson 是的
你应该看看std::variant
它有能力保存一组预定义的类型,或者如果这不起作用看看std::any
您可以自己实现std::variant
或std::any
,但这很复杂。您确定需要在SymbolTable
中存储多种数据类型吗?也许您只能存储字符串并稍后使用dataType
来解释字符串?
从 C++11 开始就可以了 - 您使用的是旧标准吗?
【参考方案1】:
我想你可能想做这样的事情:
template <typename T>
struct Node
string id;
T data;
Node *next;
;
template <typename T>
class SymbolTable
public:
void insert(string id, T dataType);
private:
Node<T> *root = nullptr;
SymbolTable<string> table;
table.insert("hello", "My data");
我实际上并没有编写代码,但这可能有效。
【讨论】:
以上是关于C++类中链表节点的多种数据类型的主要内容,如果未能解决你的问题,请参考以下文章