我使用SinglyLinkedList
创建了template <class T>
模板类。例如,如果我输入“string”作为我的命令行参数,我想创建SinglyLinkedList<string>* string_list = new SinglyLinkedList<string>();
。如果我输入“number”作为我的命令行参数,我想创建SinglyLinkedList<string>* number_list = new SinglyLinkedList<string>();
。
有没有办法可以将其结合起来,以便按照以下方式执行:
SinglyLinkedList<>* list;
if (argv[0] == "string") {
list = new SinglyLinkedList<string>();
} else if (argv[1] == "number") {
list = new SinglyLinkedList<int>();
}
如果我现在这样做,第一行会抛出错误invalid template code
。
有没有办法在C ++ 11中执行此操作?
答案 0 :(得分:1)
如果将整个列表处理放入通用函数中,事情可能会更容易:
template<typename Item>
void process_list() {
SinglyLinkedList<Item>* list = new SinglyLinkedList<Item>();
Item it;
if (std::cin >> it) {
list->push(it);
}
}
通过这种方式,您可以对Item
类型的通用项进行所有处理,只需在调用函数时区分类型一次:
int main(int argc, const char **argv) {
if (argv[0] == "string") {
process_list<string>();
} else if (argv[1] == "number") {
process_list<int>();
}
}
答案 1 :(得分:0)
模板实例化是独立的类,因此没有共同的基类,但解决这个问题的一种方法是显式定义基类:
// Empty base class
class SinglyLinkedBase {};
template <typename T>
class SinglyLinkedList : public SinglyLinkedBase
{
// As before
};
SinglyLinkedBase* list;
if (argv[0] == "string") {
list = new SinglyLinkedList<string>();
} else if (argv[1] == "number") {
list = new SinglyLinkedList<int>();
}
此外,Boost::any
或std::any
(如果您有C ++ 17编译器)可以在没有虚拟基类的情况下执行此操作。
答案 2 :(得分:0)
您正在使用运行时类型确定。
在这种情况下,如果你仍想使用相同的变量&#34; list&#34;,它的类型应该是一个抽象的基指针。只需使用&#34;类型擦除&#34; How do boost::variant and boost::any work?
中显示的技巧或者就像在答案中所示,您可能在不同的模板实例中有两个不同类型的本地版本。
如果要传递非模板参数,请记住使用
process_list<string>(in_file)
代替process_list(in_file)