【发布时间】: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>是这个模板的一个实例,它将包含ints。SymbolData<std::string>将是一个不同的实例化,它的节点将包含std::strings。您是否正在尝试创建一个数据结构,其中单个SymbolTable可以包含多个不同的节点,每个节点具有不同的数据类型? -
@NathanPierson 是的
-
你应该看看
std::variant它有能力保存一组预定义的类型,或者如果这不起作用看看std::any -
您可以自己实现
std::variant或std::any,但这很复杂。您确定需要在SymbolTable中存储多种数据类型吗?也许您只能存储字符串并稍后使用dataType来解释字符串? -
从 C++11 开始就可以了 - 您使用的是旧标准吗?
标签: c++ class templates generics struct