Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
全部都想学怎么办
CPP_PrimerPlus
提交
04df8fff
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 搜索 >>
提交
04df8fff
编写于
4月 18, 2022
作者:
全部都想学怎么办
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
上传新文件
上级
018cdddd
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
106 addition
and
0 deletion
+106
-0
Ch8函数探幽/函数模板/choices.cpp
Ch8函数探幽/函数模板/choices.cpp
+106
-0
未找到文件。
Ch8函数探幽/函数模板/choices.cpp
0 → 100644
浏览文件 @
04df8fff
/*
* 自己选择
* 在有些情况下,可通过编写合适的函数调用,
引导编译器做出您希望的选择。
请看程序choices.cpp,该程序将模板函数定义放在文件开头,
从而无需提供模板原型。与常规函数一样,
通过在使用函数前提供模板函数定义,它让它也充当原型。
*
*/
//choices.cpp -- choosing a template
#include <iostream>
template
<
class
T
>
//or template<typename T>
T
lesser
(
T
a
,
T
b
)
//#1
{
return
a
<
b
?
a
:
b
}
int
lesser
(
int
a
,
int
b
)
//#2
{
a
=
a
<
0
?
-
a
:
a
;
b
=
b
<
0
?
-
b
:
b
;
return
a
<
b
?
a
:
b
;
}
int
main
(
void
)
{
using
namespace
std
;
int
m
=
20
;
int
n
=
-
30
;
double
x
=
15.5
;
double
y
=
25.9
;
cout
<<
lesser
(
m
,
n
)
<<
endl
;
//use #2
cout
<<
lesser
(
x
,
y
)
<<
endl
;
//use #1 with double
cout
<<
lesser
<>
(
m
,
n
)
<<
endl
;
//use #1 with int
cout
<<
lesser
<
int
>
(
x
,
y
)
<<
endl
;
//use #1 with int
return
0
;
}
//最后的函数调用将double转换为int,
//有些编译器会针对这一点发出警告。
/*
* 程序提供了一个模板和一个标准函数,
其中模板返回两个值中较小的一个,
而标准函数返回两个值中绝对值较小的那个。
如果函数定义是在使用函数前提供的,
它将充当函数原型,因此这个示例无需提供原型。请看下面的语句:
cout << lesser(m, n) << endl; //use #2
这个函数调用与模板函数和非模板函数都匹配,
因此选择非模板函数,返回20。
接下来,下述语句中的函数调用与模板匹配(T为double):
cout << lesser(x, y) << endl; //use #1 with double
现在来看下面的语句:
cout << lesser<>(m, n) << endl; //use #1 with int
lesser<(m, n)中的<>指出,编译器应选择模板函数,
而不是非模板函数;编译器注意到实参的类型为int,
因此使用int替代T对模板进行实例化。
最后,请看下面的语句:
cout << lesser<int>(x, y) << endl; //use #1 with int
这条语句要求进行显式实例化(使用int替代T),
将使用显式实例化得到的函数。
x和y 的值将被强制转换为int,
该函数返回一个int值,
这就是程序显示15而不是15.5的原因所在。
*/
//多个参数的函数
/*
* 将有多个参数的函数调用与有多个参数的原型进行匹配时,
情况将非常复杂。编译器必须考虑所有参数的匹配情况。
如果找到比其他可行函数都合适的函数,则选择该函数。
一个函数要比其他函数都合适,
其所有参数的匹配程度都必须不比其他函数差,
同时至少有一个参数的匹配程度比其他函数都高。
*
*
*/
//本书并不是要解释复杂示例的匹配过程,
//这些规则只是为了让任何一组函数原型和模板都存在确定的结果。
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录