C++中怎么做才可以无需提供模板原型
在有些情况下,可通过编写合适的函数调用,引导编译器做出您希望的选择。请看程序清单8.15,该程序将模板函数定义放在文件开头,从而无需提供模板原型。与常规函数一样,通过在使用函数前提供模板函数定义,它让它也充当原型。
// choices.cpp -- choosing a template
#include <iostream>
template<class T>
T lesser(T a, T b) // #1
{
return a < b ? a : b;
}
int lesser (int a, int b) // #2
{
a = a < 0 ? -a : a;
b = b < 0 ? -b : b;
return a < b ? a : b;
}
int main()
{
using namespace std;
int m = 20;
int n = -30;
double x = 15.5;
double y = 25.9;
cout << lesser(m, n) << endl; // use #2
cout << lesser(x, y) << endl; // use #1 with double
cout << lesser<>(m, n) << endl; // use #1 with int
cout << lesser<int>(x, y) << endl; // use #1 with int
// cin.get();
return 0;
}
最后的函数调用将double转换为int,有些编译器会针对这一点发出警告。该程序的输出如下:
20
15.5
-30
15
程序清单 8.15 提供了一个模板和一个标准函数,其中模板返回两个值中较小的一个,而标准函数返回两个值中绝对值较小的那个。如果函数定义是在使用函数前提供的,它将充当函数原型,因此这个示例无
需提供原型。参见【0voice C++】请看下面的语句:
cout << lesser(m,n) << endl; // use #2
这个函数调用与模板函数和非模板函数都匹配,因此选择非模板函数,返回20。接下来,下述语句中的函数调用与模板匹配(T为double):
cout << lesser(x,y) << endl; //use #l with double
现在来看下面的语句:
cout << lesser<>(m,n) << endl; // use #l with int
lesser>(m,n)中的<> 指出,编译器应选择模板函数,而不是非模板函数;编译器注意到实参的类型为因此使用int替代T对模板进行实例化。
最后,请看下面的语句:
cout << lesser<int>(x,y) << endl; //use #l with int
这条语句要求进行显式实例化(使用int替代 T),将使用显式实例化得到的函数。x和y的值将被强制转换为 int,该函数返回一个 imnt 值,这就是程序显示 15 而不是 15.5 的原因所在。