普通函数与函数模版的区别

  • 普通函数调用时可以发生自动类型转换(隐式类型转换)
  • 函数模版调用时,如果利用自动类型推导,不会发生隐式类转换
  • 如果利用显示指定类型的方法,可以发生隐式类型转换

普通函数与函数模版的调用规则

调用规则如下:

  1. 如果函数模版和普通函数都可以实现,优先调用普通函数
  2. 可以通过空模版参数列表来强制调用函数模版
  3. 函数模版也可以发生重载
  4. 如果函数模版可以产生更好的匹配,优先调用函数模版
#include <iostream>
using namespace std;

//通过空模版的参数列表可以强制调用模版函数
template <typename T>
void myPrint(T a,T b)
{
    cout<<"调用的模版"<<endl;
}

void myPrint(int a,int b)
{
    cout<<"调用的普通函数"<<endl;
}
void test01()
{
    int a=10;
    int b=20;
    //myPrint(a,b); //调用的普通函数
    // 强制调用模版函数
    // 通过空模版的参数列表
    // 这种方式可以避免编译器根据参数类型推导出普通函数
    // 而直接调用模版函数
    // 这种方式在函数重载时很有用
    myPrint<int>(a,b); //调用的模版 
}


int main(){
     test01();

}

#include <iostream>
using namespace std;

//通过空模版的参数列表可以强制调用模版函数
template <typename T>
void myPrint(T a,T b)
{
    cout<<"调用的模版"<<endl;
}

template <typename T>
void myPrint(T a,T b,T c)
{
    cout<<"调用的重载模版"<<endl;
}

void myPrint(int a,int b)
{
    cout<<"调用的普通函数"<<endl;
}
void test01()
{
    int a=10;
    int b=20;
    //myPrint(a,b); //调用的普通函数
    // 强制调用模版函数
    // 通过空模版的参数列表
    // 这种方式可以避免编译器根据参数类型推导出普通函数
    // 而直接调用模版函数
    // 这种方式在函数重载时很有用
    myPrint<int>(a,b); //调用的模版 
    myPrint(a,b,30); //调用的重载模版
}


int main(){
     test01();

}

如果函数模版可以产生更好的匹配,优先调用函数模版

char c1='a';
char c2='b';

myPrint(c1,c2);

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐