我可以调用作为模板参数的对象的任何方法吗?

时间:2015-03-30 11:49:50

标签: c++

说我有这样的模板函数:

template<typename T> void do_something(T object, string type){
    if(type == "class_1"){
        int result = object.class_1_method();
    else if(type == "class_2"){
        int result = object.class_2_method();
    }
}

这似乎在编译时引起问题 - 似乎编译器正在遍历每个逻辑路径并针对类型为class_1_method()的对象测试class_2,然后意识到{{1}没有那个方法。有没有办法解决这个问题,或者每个可能的类型名class_2是否需要能够成功通过所有可能的逻辑路径?

3 个答案:

答案 0 :(得分:7)

整个函数需要对给定类型进行编译,否则会发生错误。

看起来你真正想要的是模板专业化:

template <typename T> void do_something(T object);
template <> 
void do_something<class_1> (class_1 object)
{ int result = object.class_1_method(); }
template <> 
void do_something<class_2> (class_2 object)
{ int result = object.class_2_method(); }

答案 1 :(得分:2)

模板不是直接执行的代码,它是一个模型,编译器将使用该模型为代码中的模板实例化的每种类型生成代码。当你编写一个模板时,你会以某种方式声明一个接口,你实例化模板的每个类型必须符合。

在您的情况下,如果您使用do_something类型的参数调用Class1,则在模板实例化后最终会得到以下等效内容

do_something(Class1 object, string type){
    if(...){
        int result = object.class_1_method();
    else (...){
        int result = object.class_2_method();//Err... not in Class1
    }
}

显然无法编译。

分支类型的方法是使用template specialization

答案 2 :(得分:2)

简单的重载也会这样做:

void do_something(Class1 const& object, string type){
        int result = object.class_1_method();
}

void do_something(Class2 const& object, string type){
        int result = object.class_2_method();
}

与模板专业化相比,重载通常更容易掌握。