上传新文件

上级 018cdddd
/*
* 自己选择
* 在有些情况下,可通过编写合适的函数调用,
引导编译器做出您希望的选择。
请看程序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.
先完成此消息的编辑!
想要评论请 注册