函数模板

目录

1、什么是函数模板

2、函数模板的隐式实例化

3、函数模板的显示实例化

4、函数模板的显示具体化

5、函数模板的实例化与具体化的区别

6、测试程序


1、什么是函数模板

模板函数不是实际存在的函数,编译器不能为其生成可执行的代码。它只是一个用于生成函数定义的方案,只有在实际使用时,才能创建具体的实例函数(模板函数)。

#include <iostream>

template <typename T>
void fun(T a, T b) //函数模板
{
    cout << a << " " << b << endl;
}
int main()
{
    int a = 1;
    int b = 2;
    fun<int>(a, b);	 
    system("pause");
}

2、函数模板的隐式实例化

(1)它是在函数调用时,根据参数的具体类型来确定函数模板中的泛型类型生成实例。

int a = 1;
int b = 2;
fun(a, b); //通过判断a,b的类型,产生对应的模板函数实例称为隐式实例化。

3、函数模板的显示实例化

(1)提前声明具体的实例。

template void fun<int>(int& , int& );

(2)在泛型中指出实例对象

fun<int>(a, b);

4、函数模板的显示具体化

(1)对于某些特殊类型,可能不适合模板实现,需要重新定义实现,此时可以使用显示具体化。

(2)显示具体化的原型和定义应以template<>开头,并通过名称指出具体化类型。

(3)对于给定的函数名,可以有非模板函数,模板函数和显示具体化函数以及它们的重载版本。

(4)非模板函数优先于具体化模板函数,具体化模板函数优先于模板函数。

template<> void fun<double>(double a, double b) //= template<> void fun(double a, double b)
{
    cout << "<double> " << a - b << endl;
}

5、函数模板的实例化与具体化的区别

(1)显示实例化

template void fun<int>(int& , int& );

(2)显示具体化

template<> void fun<double>(double a, double b);
template<> void fun(double a, double b);

显示实例化是提前创建该类型的实例模板函数,而显示具体化是函数模板内的功能不适合该类型,需要重新定义。

6、测试程序

#include <iostream>

using namespace std;

template <typename T>
void fun(T a, T b)	//函数模板
{
    cout << a << " " << b << endl;
}

//显示具体化
template<> void fun<double>(double a, double b) //= template<> void fun(double a, double b)
{
    cout << "<double> " << a - b << endl;
}

//显示实例化
template void fun<int>(int&, int&);

int main()
{
    int a = 1;
    int b = 2;
    //fun(a, b);  //不能与a,b类型的显示实例化共存
    short c = 0;
    short d = 0;
    fun(c, d);
    fun<int>(a, b);
    fun<double>(7.2, 3.6);
    system("pause");
}


输出:

0 0
1 2
<double> 3.6

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值