c++的模板的显式实例化,隐式实例化,显式具体化

具体化

一、显式具体化

显式具体化:
对某个模板的函数的形参类型和返回值类型进行具体的说明
②并在函数名称右边以尖括号的形式标注好T的具体类型,但其实可以省略尖括号标注的形式,
③直接在返回值和形参列表处说明具体的形参的数据类型即可,所以显式具体化的函数中一定不能有未知类型T
④在函数体那里写具体的代码。这段代码可以和模板中的代码不同,因为对于某些特殊类型,可能不适合模板实现,需要重新定义实现,此时可以使用显示具体化!

设Rutrn_Type , Type_1 , Type_2 , … , Type_n为具体类型,可以为string , int ,double 等常用数据类型
显式具体化语法格式如下:

template <>  Return_Type Function_Name(Type_1 arg_1 , .. . , Type_n arg_n )
{
	// 函数体 
}

具体例子如下

template <> void run(string name)
{
	std::cout << name << "正在以显式具体化的方式跑步上学" << '\n' ;
} 

显式具体化的一些说明:
① 显式具体化一个函数后,编译器找到了与函数调用相匹配的具体化函数时 , 将使用该函数 ,
而不会去寻找模板了 , 所以 显式具体化的函数的执行的优先级会比模板函数的高!
显式具体化的函数的声明和原型都应该以template <> 打头 , 并通过名称指出其具体类型
③执行的优先级:
非模板函数 > 显式具体化函数或显式实例化函数(这两者互斥,不能共存) > 模板函数

template <typename T>
void run(T name)
{
	cout << name << "正在跑步上学\n";
}
template <> void run(int name): 显示具体化函数run , run函数旁省略了<int>标注
{
	cout << name << "正在以显示具体化的方式跑步上学\n";
}
下面的代码因为只是显式实例化而不需要方法体 , 
在给函数的返回值和形参列表指定参数后,编译器将会自动根据模板而生成函数实例,
所以显式实例化不需要函数体!!!
(但实际上,下面的函数声明不能和上面显式具体化的函数共存,否则编译器报错!!)
  template void run(string name);

二、实例化(实例化分为显式实例化和隐式实例化)

①隐式实例化:

模板本身并不会生成函数定义 , 它只是一个用于生成函数定义的一套方案 , 编译器使用模板为
特定类型生成函数定义时,得到的是模板实例
, (即由编译器推断出函数的形参和返回值的具体类型时 , 就会生成一个对应的返回值和形参的类型都是具体类型的函数 , 由一个相对抽象的函数变成了一个具体的函数),这种实例化方式称为隐式实例化 ,也就是说由编译器推断形参类型的生成对应具体函数实例的过程就是隐式实例化

②显式实例化

我们可以直接命令编译器,由程序员显式指定T的具体类型再根据模板生成具体的函数,这种过程称为显式实例化 ,其中T完全被具体类型所替换

显式实例化语法:
①在返回值前加上关键字 template , 在函数名称右边使用尖括号标注抽象参数T的具体类型
(不同于显式具体化,这里的尖括号不能省略)
template Return_Type Function_Name<Type_1,..., Type_n>(Type_1 arg_1 , .. . , Type_n arg_n);
注:
因为这里是根据函数模板生成函数实例,
用显式实例化的方式声明一个相对具体的函数只是把模板中的抽象参数T全部替换为具体的数据类型,
如int , double ,string ,long 等,除此之外和模板函数完全一样
template <typename T>
void run(T name)
{
	cout << name << "正在跑步上学\n";
}
template void run(string name); 这里string代替了T ,void 保持不变

三、代码示例

下面是一段函数模板的具体代码示例:

#include<iostream>
using namespace std;

template <typename T>

void run(T name)  
{
    cout << name << "正在跑步上学\n";
}
下面的一行代码为 显式实例化 , 程序员显式指定参数类型,编译器根据模板生成函数实例,所以叫显式实例化
 下面显式实例化同为string类型的参数将报错,
//  template void run<int>(string name);  


下面代码是 显式具体化,有点类似于重写模板的函数 了 
template <> void run(string name)
{
	cout << "现在执行的是显式具体化函数\n";
    cout << name << "正在以显式具体化的方式跑步上学\n";
}

int main()
{
    string name = "你刚弟我";
    run(name);
    return 0;
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿维的博客日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值