二、模板显式推断
在C++中,若函数模板返回类型需要用户指定,那么在定义函数模板时,模板参数的顺序是很重要的,如下代码:
template <typename T1, typename T2, typename T3> //模板一
T1 sum(T2 a, T3 b)
{return a + b;
}
在调用的时候就需要指定T1的类型,如:sum<float>(1,2);于是sum函数的返回类型为float。但是有时候由于设计者的糟糕设计,会导致一些问题:
template <typename T1, typename T2, typename T3> //模板二
T3 sum(T1 a, T2 b)
{return a + b;
}
那么再进行上述调用,则会出现问题:sum<float>(1, 2);现在这个调用里指定T1类型为float,但是实际传进来的是1(int类型),会进行隐式类型转换,将1转换为float;T2的类型也可以根据sum(1,2)调用的第二个实参推断出来,这里是可能会是int。那么T3是什么类型呢?显然这里编译器无法推断T3的类型,需要在调用时指定才能推断:
sum<int, int, int>(1, 2); //这样T3就推断出来是int。
在指定显示模板实参时指定的类型是和模板参数匹配的,顺序是一一对应的,如:
- 使用sum<int>(1, 2)对上面的第一个模板进行调用,那么T1对应int,T2和T3则通过推断得出。
- 使用sum<int>(1, 2)对上面的第二个模板进行调用,那么T1对应的类型是int,T2可以根据实际穿进去的参数进行推断,这里2为int那么T2类型就是int,那么编译器就无法知道T3的实际类型了。