Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
全部都想学怎么办
CPP_PrimerPlus
提交
2522428c
C
CPP_PrimerPlus
项目概览
全部都想学怎么办
/
CPP_PrimerPlus
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
CPP_PrimerPlus
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
2522428c
编写于
4月 05, 2022
作者:
全部都想学怎么办
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
上传新文件
上级
2e7aa294
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
76 addition
and
0 deletion
+76
-0
Ch8函数探幽/函数模板/显示具体化.cpp
Ch8函数探幽/函数模板/显示具体化.cpp
+76
-0
未找到文件。
Ch8函数探幽/函数模板/显示具体化.cpp
0 → 100644
浏览文件 @
2522428c
//假设定义了如下结构:
struct
job
{
char
name
[
40
];
double
salary
;
int
floor
;
};
//另外,假设希望能够交换两个这种结构的内容。
//原来的模板使用下面的代码来完成交换:
temp
=
a
;
a
=
b
;
b
=
temp
;
/*
* 由于C++允许将一个结构赋给另一个结构,因此即使T是一个job结构,
上述代码也适用。然而,假设只想交换salary 和 floor 成员,
而不交换name成员,则需要使用不同的代码,
但Swap()的参数将保持不变(两个job 结构的引用),
因此无法使用模板重载来提供其他的代码。
*/
/*
* 然而,可以提供一个具体化函数定义——称为显式具体化
(explicit specialization),其中包含所需的代码。
当编译器找到与函数调用匹配的具体化定义时,
将使用该定义,而不再寻找模板。
*/
//具体化机制随着C++的演变而不断变化。下面介绍C++标准定义的形式。
//第三代具体化(ISO/ANSIC++标准)
//C++98标准提供了下面的具体化方法
//1.对于给定的函数名,可以有非模板函数、模板函数和显式具体化模板函数以及它们的重载版本。
//2.显式具体化的原型和定义应以template<>打头,并通过名称来指出类型。
//3.具体化优先于常规模板,而非模板函数优先于具体化和常规模板。
//下面是用于交换job 结构的非模板函数、模板函数和具体化的原型:
//no template function prototype
void
Swap
(
job
&
,
job
&
);
//template prototype
template
<
typename
T
>
void
Swap
(
T
&
,
T
&
);
//explicit specialization for the job type
template
<
>
void
Swap
<
job
>
(
job
&
,
job
&
);
/*
* 正如前面指出的,如果有多个原型,则编译器在选择原型时,
非模板版本优先于显式具体化和模板版本,
而显式具体化优先于使用模板生成的版本。
例如,在下面的代码中,第一次调用Swap()时使用通用版本,
而第二次调用使用基于job类型的显式具体化版本。
*/
int
main
(
void
)
{
double
u
,
v
;
Swap
(
u
,
v
);
//use template
job
a
,
b
;
Swap
(
a
,
b
);
//use void Swap<job>(job&, job&)
}
//Swap<job>中的<job>是可选的,因为函数的参数类型表明,
//这是job的一个具体化。因此,该原型也可以这样编写:
template
<
>
void
Swap
(
job
&
,
job
&
);
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录