声明后初始化C ++模板类

时间:2018-03-06 02:04:58

标签: c++ eclipse c++11 templates linked-list

我使用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中执行此操作?

3 个答案:

答案 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::anystd::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)