您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记59——函数模板的显式实参

2016-04-24 23:59 387 查看

1,引入

通常,函数模板的类型形参的具体类型是通过输入的实参的类型推断出来的。但也有例外,那就是显式实参——直接给出函数模板的形参类型,不用推断。
比如标准库algorithm头文件里的max()函数,是通过函数模板来实现的,它只有一个类型形参。所以如果给它传入一个int和一个double,是会报错的。
int i = 3;
double d = 4.4;

cout << max(i, d) << endl;
编译:
“std::max”: 未找到匹配的重载函数

未能从“int”为“std::initializer_list<_Elem>”推导 模板 参数

但可以用如下的方式实现编译:
int i = 3;
double d = 4.4;

//cout << max(i, d) << endl;//error
cout << max(i, static_cast<int>(d)) << endl;    //静态类型转换,double->int
cout << max(static_cast<double>(i), d) << endl; //静态类型转换,int->double
cout << max<double>(i, d) << endl;              //显式实参,指定类型为double
cout << max<int>(i, d) << endl;                 //显式实参,指定类型为int


后两种法子,用的就是显示实参。这里不再有类型推断,直接将类型给出来了。一旦使用了显式实参,就不再关心输入的实参的类型,而一概将其转化为显示实参的类型了。

2,有多个类型形参的情况

考虑如下函数模板:
template <class T1, class T2, class T3> T1 sum(T2, T2);


由于T1仅用于返回类型,没有实参的类型可用于推断T1的类型,所以T1的类型必须显式指定。
int i = 3;
long lng = 9;
long val3 = sum<long>(i, lng);
上面的表达式,显式执行T1的类型,通过实参推断T2和T3的类型。

有一个需要思考的问题:编译器如何知道我们显式指定的long指的是T1还是T2抑或T3呢?
答案是:显式模板实参从左到右与对应模板形参相匹配,第一个显式模板实参与第一个模板形参匹配,第二个显式模板实参与第二个模板形参匹配,以此类推。加入可以从函数形参推断(如上面例子里的T2和T3),则只有最右边的形参的显式模板实参可以省略。

假如将sum()定义成如下形式:
template <class T1, class T2, class T3> T3 sum(T2, T1);
我们为了指定T3的类型,而不得不把T1和T2的类型都指定了。
long val3 = sum<long,int,long>(i, lng);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: