【问题标题】:Multiple data types of Linked List nodes in class C++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

还有没有办法

  1. cpp file 中使用变量 + 条件推断数据类型(例如:如果 dataType == "number" 然后推断 T -> int)?

  2. 摆脱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 开始就可以了 - 您使用的是旧标准吗?

标签: c++ class templates generics struct


【解决方案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");

我实际上并没有编写代码,但这可能有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 2010-09-18
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多