函数模板

/*
1 函数模板可以像普通函数一样被重载
2 C++编译器优先考虑匹配普通函数
3 如果函数模板可以产生一个更好更精确的匹配,那么选择模板
4 可以通过空模板实参列表的语法限定编译器只匹配模板函数
*/

/*
函数模板不允许自动类型转化,隐式的类型转换编译器会报错
普通函数能够进行自动类型转换
*/

#include <iostream>
using std::cout;
using std::cin;
using std::endl;


int Max(int a, int b)
{
    cout << "int Max(int a, int b)" << endl;
    return a > b ? a : b;
}

template<typename T>
T Max(T a, T b)
{
    cout << "T Max(T a, T b)" << endl;
    return a > b ? a : b;
}

template<typename T>
T Max(T a, T b, T c)
{
    cout << "T Max(T a, T b, T c)" << endl;
    return Max(Max(a, b), c);
}


void main()
{
    cout << Max(1, 3) << endl;//优先匹配普通函数
    cout << Max<>(2, 4) << endl;//显式告知编译器,只匹配模板函数

    cout << Max(3.0, 4.0) << endl;

    cout << Max(5.0, 6.0, 7.0) << endl;

    cout << Max('a', 80) << endl;

    cin.get();
    return;
}

函数模板的深入理解

1.编译器并不是提前把函数模板处理成能够处理任意类型的函数,这样效率很低
2.编译器编译期间,通过函数模板参数,生成不同类型的函数

编译器会对函数模板进行两次编译
―在声明的地方对模板代码本身进行编译
―在调用的地方对参数替换后的代码进行编译


版权声明:本文为michael019原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。