说我有这样的模板函数:
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
是否需要能够成功通过所有可能的逻辑路径?
答案 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();
}
与模板专业化相比,重载通常更容易掌握。