C++--函数模板与普通函数

模板函数

当我们要对不同的数据类型进行同样的操作的时候,
我们可能要分别编写几个函数去对应数据类型进行相似的操作,比如说交换两个数据
我们使用函数模板就会大大提高效率
示例:

#include <iostream>
using namespace std;

template <typename T>//声明一个模板,T是一个通用数据类型
//或template<class T>
void Exchanged(T &a, T &b)
{
    T temp = a;
    a = b;
    b = temp;
}

void example()
{
    int a = 1;
    int b = 2;
    char c = 's';
    char d = 'd';

    //1、自动类型推导
    Exchanged(a, b);
    //2、显式指定类型
    Exchanged<int>(a,b);
    Exchanged(c, d);
    cout << "a = " << a << "b = " << b << endl;
}

int main()
{
  example();
  return 0;
}

这里有两个注意事项:
在使用函数模板的时候,T的类型必须可知,才可以使用
在使用自动类型推导函数模板的时候,数据类型必须一致。

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

#include <iostream>
using namespace std;

int myAdd(int a, int b)
{
    return a + b;
}

template<class T>
T myAdd2(T a, T b)
{
    return a + b;
}

int main()
{
   int a = 1;
   int b = 2;
   char c = 'c';
   cout << myAdd(a, b) << endl;
   cout << myAdd(a, c) << endl;//不会报错,会自动进行类型转换
   //cout << myAdd2(a, c)) << endl; //如果传进a和c则报错 自动类型推导不发生自动类型转换
   cout << myAdd2<int>(a, c) << endl;//指定类型不会报错 显式指定类型 发生隐式类型转换
    return 0;
}

模板函数与普通函数同名会先调用谁

#include <iostream>
using namespace std;

//普通函数
void myPrint(int a,int b)
{
    cout << "普通函数调用" << endl;
}

//函数模板
template<class T>
void myPrint(T a, T b)
{
    cout << "函数模板调用" << endl;
}

//函数模板重载
template<class T>
void myPrint(T a, T b, T c)
{
    cout << "重载函数模板调用" << endl;
}

void example()
{
    int a = 1;
    int b = 2;
    //myPrint(a, b);//结果 普通函数调用
    //myPrint<>(a, b);//结果 函数模板调用  空模板参数列表,强制调用函数模板
    char c1 = 'z';
    char c2 = 's';
    myPrint(c1, c2);
}

int main()
{
    example();
    return 0;
}

总结:
优先调用普通函数
如果想强制调用模板函数,可以使用空参数列表
如果函数模板可以更好匹配使用条件,则优先调用函数模板
函数模板也可以进行重载
注意:一般提供了模板函数,就不要再使用同名的普通函数。

发布了20 篇原创文章 · 获赞 43 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43086497/article/details/105017593