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&lt;int&gt; 是这个模板的一个实例,它将包含ints。 SymbolData&lt;std::string&gt; 将是一个不同的实例化,它的节点将包含 std::strings。您是否正在尝试创建一个数据结构,其中单个 SymbolTable 可以包含多个不同的节点,每个节点具有不同的数据类型? @NathanPierson 是的 你应该看看std::variant它有能力保存一组预定义的类型,或者如果这不起作用看看std::any 您可以自己实现std::variantstd::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++类中链表节点的多种数据类型的主要内容,如果未能解决你的问题,请参考以下文章

C中链表中的错误

c_cpp 删除O(1)中链表中的节点

常用数据结构:单向链表和双向链表的实现

Python 可以将不同的数据类型存储在列表或链表中

C++ 链表 - 释放节点给出错误

c语言中链表的问题