模板显示实参
在某些情况下,编译器无法推断出模板的实参类型。其他一些情况下,我们希望用户控制模板实例化。当函数类型与参数列表中任何类型不同的时候,这两种情况最常出现。
指定显示的模板实参
在某些情况下,编译器无法推断出模板实参的类型。在其他一些情况下,我们希望允许用户控制模板实例化。当函数返回类型和参数列表的任何类型都不同的时候,这两种情况最常出现。
指定显示的模板实参
作为一个允许用户指定使用类型的例子,我们将定义一个名为sum的函数模板,它以接收两种不同类型的参数。我们允许用户指定结果的类型。这样,用户就可以选择合适的精度了。
template <typename T1,typename T2,typename T3>
T1 sum(T2,T3);
在这个例子中,没有任何函数实参类型来判断T1的类型。每次调用sum时候调用者必须为T1提供一个显示模板实参。
我们提供显示模板实参的方式与定义类模板实例的方式不同。显示模板实参在尖括号中给出,位于函数名之后,参数列表之前。
auto val3 = sum<long,long>(i,lng);
此调用显示指定T1的类型。而T2和T3的类型由编译器从i和long的类型来判断。
显示模板实参由左到右的顺序与对应的模板参数匹配;第一个模板实参与第一个模板参数匹配,第二个实参与第二个参数匹配,依次类推。只有尾部参数的显示模板实参才可以或略,而且前提是他们可以从函数参数推断出来。如果我们的sum函数按照如下的形式来编写:
template <typename T1,typename T2,typename T3> T1 sum(T2 a,T3 b)
{
return a+b;
}
int main()
{
auto data = sum<long,long>(1,2);
auto data2 = sum<long>(1,2);
return 0;
}
这两种写法都是可以的编译器可以自行推断出返回结果
string D1("a");
string D2("n");
auto data2 = sum<string>(D1,D2);
这些例子告诉我们当我们显示的提供一些模板实参的时候,编译器是具有一定的推断能力的。