模版初阶(更新)-函数模版

语法格式: t e m p l a t e < t y p n a m e T 1 , t y p n a m e T 2... > template<typname T1,typname T2...> template<typnameT1,typnameT2...>

void swap(int& a, int& b)
{
    int tmp = a;
    a = b;
    b = tmp;
}
void swap(double& a, double& b)
{
    double tmp = a;
    a = b;
    b = tmp;
}

int main()
{
    int a = 1, b = 2;

    double c = 1.1, d = 2.2;

    cout << a << " " << b << endl;
    swap(a, b);
    cout << a << " " << b << endl;
    
    cout << "----------------" << endl;
    
    cout << c << " " << d << endl;
    swap(c, d);
    cout << c << " " << d << endl;

    return 0;
}

在C语言中,如果我们需要分别交换 i n t int int d o u b l e double double 的数据,那么我们需要定义两个swap函数并且还不能重名。(C语言并不支持函数重载)。

而在C嘎嘎中:

在这里插入图片描述
我们只需要写一个模版就可以了。这里的T在编译的时候会默认替换为我们的 i n t int int d o u b l e double double

在这里插入图片描述
同时通过调试发现,这两个swap都进入我们写的函数模版,那么这两个Swap调用的是同一个函数吗?
在这里插入图片描述
通过反汇编发现,此时我们两个调用的并不是同一个函数。

在这里插入图片描述
当我们使用我们的 S w a p ( ) Swap() Swap()模版的时候,编译器会去默认推演我们此时的参数类型,然后编译器自动生成一个 S w a p ( ) Swap() Swap()函数,中国有句古话:死道友不死贫道[doeg]。咱们只管写一个模版,其他的交给编译器。

在这里插入图片描述
但是如果我们只有一个模版参数的话,传入两个不同类型编译器推导不出来。

此时我们有以下几种方法:
在这里插入图片描述

  1. 添加模版参数
  2. 进行强制类型转化
  3. 直接给定模版参数类型,不让编译器推演

A d d < i n t > Add<int> Add<int> 这个叫做显式实例化。它指定了参数的类型,编译器就不会推演了,T默认会 i n t int int 类型。

上一篇:【网络安全】SSRF 之 Azure Digital Twins Explorer


下一篇:Rockchip RK3588 - Rockchip Linux SDK脚本分析