摘要:本文主要向大家介绍了C++语言的函数模板,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。
本文主要向大家介绍了C++语言的函数模板,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。
模板的意义:
假设我们需要实现一个交换函数Swap,入参可以是int,double,class,···。如果对于每中类型都实现一个Swap函数,效率低下,并且容易漏掉某些类型。这样的话用模板就比较好了。
定义:
template <class AnyType>
void Swap(AnyType &a, AnyType &b)
{
AnyType temp;
temp = a;
a = b;
b = temp;
}
使用很简单,直接调用。
但是模板有一个不好的地方,就是如果 AnyType 是一个 struct 结构,我们需要交换这2个结构体中的某些元素的值,这个模板就不能按要求完成工作了。这里的一个方案就是对这个特殊结构的交换操作重新实现一个交换函数,这里就有一个问题了,如果我们单独实现了一个函数,当调用Swap函数时,我们使用的是具体实现的函数,还是使用模板生成的函数呢?
这里就需要标准了。
ISO/ANSI C++标准 -- 第三代具体化
对于给定的函数名,可以是非模板函数,模板函数和显示具体话模板函数
显示具体化模板函数的原型和定义应以 template <> 开始
具体化将覆盖模板函数,非模板函数将覆盖具体化和模板函数
#include <iostream>
using namespace std;
struct ijob {
int a;
double b;
};
// 模板函数template <class Any>void Swap(Any &a, Any &b) {
Any temp;
temp = a;
a = b;
b = temp;
}
// 非模板,具体函数void Swap(ijob &ia, ijob &ib) {
double temp;
temp = ia.b;
ia.b = ib.b;
ib.b = temp;
}
// 模板具体化函数template<> void Swap<ijob> (ijob &ia, ijob &ib) {
int temp;
temp = ia.a;
ia.a = ib.a;
ib.a = temp;
}
int main() {
int a = 1, b = 2;
Swap(a, b);
cout << "a = " << a << "; b = " << b << endl;
ijob ia, ib;
ia.a = 1;
ia.b = 1.00;
ib.a = 2;
ib.b = 2.00;
Swap(ia, ib);
cout << "ia.a = " << ia.a << ", ia.b = " << ia.b << endl;
cout << "ib.a = " << ib.a << ", ib.b = " << ib.b << endl;
return 0;
}
结果:
总结:
函数模板本身并不会生成函数的定义,它只是一个用于生成函数定义的方案当编译器编译代码的时候,会根据具体的类型生成函数定义,就是我们可以调用的函数,这个过程为模板的实例化,这种实例化称为隐式实例化模板也是可以显示实例化的,只需在前面加上 template 关键字显示具体化就是在前面加上 template <>
问题
显示具体化和显示实例化的区别是什么?不懂,但是同一个编程单元中,不能同时显示具体化和显示实例化。
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号