C++ 函数重载解析策略( 三 )

部分排序规则的另一个示例程序如下,它与上一个例子有异曲同工之妙 。由于模板 #2 做了特定的假设:数组内容是指针,对类型的要求更加地具体,因此在调用时第一个参数若传入指针数组 pt,则将实际匹配函数 #2
//两个常规模板函数template <typename T>void ShowArray(T arr[], int n);//原型#1template <typename T>void ShowArray(T * arr[], int n); //原型#2//调用程序包含如下代码int things[6] = {13, 31, 103, 301, 310, 130};int * pt[3] = {&things[0], &things[2], &things[4]};ShowArray(things, 6);//使用版本#1ShowArray(pt, 3);//使用版本#2//函数定义...将有多个参数的函数调用与有多个参数的原型进行匹配时,编译器必须考虑所有参数的匹配情况 。如果找到比其他可行函数都合适的函数,则选择该函数 。一个函数要比其他函数都合适,其所有参数的匹配程度都必须不比其他函数差,同时至少有一个参数的匹配程度比其他函数都高 。
在有些情况下,可通过编写合适的函数调用,来引导编译器做出程序员期望的选择 。如下所示,其中模板函数返回两个值中较小的一个,非模板函数返回两个值中绝对值较小的那个 。第一次调用时根据重载解析策略选择了非模板函数 #2;第二次调用时根据重载解析策略选择了模板函数 #1double 版本,属于模板函数的隐式实例化;第三次调用的 <> 指出,编译器应该选择模板函数,此时编译器会查看调用函数时的实参类型来进行实例化,也属于模板函数的隐式实例化;第四次调用的 <int> 显式指出,编译器应该使用模板函数的 int 实例化版本,此时属于模板函数的显式实例化 。
【C++ 函数重载解析策略】#include <iostream>//函数#1template<class T>T lesser(T a, T b){return a < b ? a : b;}//函数#2int lesser(int a, int b){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;//使用#2,结果为20cout << lesser(m, n) << endl;//使用#1,double隐式实例化,结果为15.5cout << lesser(x, y) << endl;//使用#1,int隐式实例化,结果为-30cout << lesser<>(m, n) << endl;//使用#1,int显式实例化,结果为15cout << lesser<int>(x, y) << endl;return 0;}

经验总结扩展阅读