1. 函数模板必须严格类型匹配,普通函数则可以进行数据类型隐式转换
  2. 对于内置数据类型,函数模板可进行推导,自定义类型不可以
  3. 函数模板可被重载
  4. C++ 编译器优先考虑普通函数
  5. 可以通过空模板实参列表的语法限定编译器只能通过模板匹配
  6. 如果函数模板可以产生一个更好的匹配,就选择模板
  7. 编译器根据函数模板调用情况,从函数模板和具体类型产生不同的函数
    编译器会对函数模板进行两次编译
    • 在声明的地方对模板代码本身进行编译;
    • 在调用的地方对参数替换后的代码进行编译
template<class T>
T MyAdd(T a, T b){
    return a + b;
}
// 函数一
int MyAdd(int a, int b){
    return a + b;
}
// 函数二
int MyAdd(int a, char c){
    return a + c;
}
int main()
{
    cout << MyAdd(1, 2) << endl;    // 优先调用普通函数
    cout << MyAdd<>(1, 2) << endl;    // 强制调用模板函数
    cout << MyAdd(1.1, 2.2) << endl;  // 函数模板数据类型推导
    cout << MyAdd<double>(1.1, 2.2) << endl;    // 显式调用
    cout << MyAdd(1, 'a') << endl;  // 没有函数二则调用函数一 MyAdd (a=1, c=97 'a')
    cout << MyAdd('a', 1) << endl;  // 没有函数一则调用函数二 MyAdd (a=97, c=1 '\001')

    return 0;
}

输出:

3
3
3.3
3.3
98
98