C++函数模板

来源:互联网 发布:投行 知乎 编辑:程序博客网 时间:2024/06/05 04:05

函数模板可以重载,只要它们的形参表不同即可

Example:template<class T1, class T2>void print(T1 arg1, T2 arg2){    cout << arg1 << “ ” << arg2 << endl;}template<class T>void print(T arg1, T arg2){    cout << arg1 << “ ” << arg2 << endl; }

C++编译器遵循以下优先顺序:

Step 1: 先找参数完全匹配普通函数(非由模板实例化而得的函数)

Step 2: 再找参数完全匹配模板函数

Step 3: 再找实参经过自动类型转换后能够匹配的普通函数

Step 4: 上面的都找不到则报错

函数模板调用顺序

template <class T>T Max(T a, T b){    cout << "Template Max 1" <<endl;    return 0;}template <class T, class T2>T Max(T a, T2 b){    cout << "Template Max 2" <<endl;    return 0;}double Max(double a, double b){    cout << "MyMax" << endl;    return 0;}int main(){    int i=4, j=5;    Max(1.2,3.4); //调用Max(double, double)函数    Max(i, j); //调用第一个T Max(T a, T b)模板生成的函数    Max(1.2, 3); //调用第二个T Max(T a, T2 b)模板生成的函数    return 0;}

赋值兼容原则引起函数模板中类型参数的二义性

template<class T>T myFunction(T arg1, T arg2){       cout<<arg1<<“ ”<<arg2<<“\n”;       return arg1;} …myFunction(5, 7); //ok: replace T with intmyFunction(5.8, 8.4); //ok: replace T with doublemyFunction(5, 8.4); //error: replace T with int or double? 二义性

可以在函数模板中使用多个类型参数可以避免二义性

template<class T1, class T2>T1 myFunction( T1 arg1, T2 arg2){       cout<<arg1<<“ ”<<arg2<<“\n”;       return arg1;} …myFunction(5, 7); //ok:replace T1 and T2 with intmyFunction(5.8, 8.4); //ok: replace T1 and T2 with doublemyFunction(5, 8.4); //ok: replace T1 with int, T2 with double

0 0