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

Can I invoke any method of an object that is a template argument?

本文关键字:对象 任何 方法 参数 调用 我可以      更新时间:2023-10-16

假设我有一个模板函数,如下所示:

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_2的对象测试class_1_method(),然后意识到class_2没有该方法。有没有办法解决这个问题,或者每个可能的类型名T都需要有能力成功地通过每个可能的逻辑路径?

对于给定的类型,整个函数需要是可编译的,否则将发生错误。

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

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(); }

模板不是直接执行的代码,它是编译器用来为代码中安装模板的每种类型生成代码的模型。当你编写一个模板时,你以某种方式声明了一个接口,你安装模板的每种类型都必须符合这个接口

在您的情况下,如果您使用类型为Class1的参数调用do_something,则在模板安装后,您将得到以下等效项

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

显然无法编译。

在类型上分支的一种方法是使用模板专门化。

简单的重载也可以:

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();
}

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

相关文章: