用示例程序解读 C++ 模板函数
【摘要】 让我们假设我们需要创建一个计算数字绝对值的函数。当你有一个正数时,这个数的绝对值就是同一个数,但是如果这个数是负数,那么这个数的绝对值就是符号改变的那个数。因此,如果您使用 int 数据类型,该函数将如下所示:int AbsolteValue( int nNumber){ return (nNumber>0)? nNumber:-nNumber;}但是,如果有人需要双数据类型而不是 int...
让我们假设我们需要创建一个计算数字绝对值的函数。
当你有一个正数时,这个数的绝对值就是同一个数,但是如果这个数是负数,那么这个数的绝对值就是符号改变的那个数。
因此,如果您使用 int 数据类型,该函数将如下所示:
int AbsolteValue( int nNumber)
{
return (nNumber>0)? nNumber:-nNumber;
}
但是,如果有人需要双数据类型而不是 int 的相同函数怎么办?在这种情况下,您可以创建一个如下所示的函数:
double AbsoluteValue( double dNumber)
{
return (dNumber>0)? dNumber:-dNumber;
}
以同样的方式,我们可以不断地创建函数来覆盖:float、long int、long long int、long double 等等。
当您不想使用通常的数据类型,但想使用带有 typedef 的自定义数据类型时,也有可能出现这种情况。
我们不可能预测我们的函数可能使用的所有数据类型。在这些情况下,“函数模板”就派上用场了。
C++ 函数模板语法
有两种可接受的语法:
template <class TypeName1, class TypeName2, ...>
Or,
template <typename Typename1, typename TypeName2>
现在,函数可能是这样的:
tempalte<typename T>
T
AbsoluteValue( T tNumber)
{
return (tNumber>0)? tNumber: -tNumber;
}
因此,该算法不再依赖于代码中使用的数据类型。无论使用什么数据类型,都会实现该算法。
现在是时候问问自己了,使用这种方法我们得到了什么,失去了什么。
嗯,我们从一般性上获益,而我们从速度上输了。
换句话说,如果您需要为一种数据类型创建更快的解决方案,请不要使用模板。
但是,如果您的目标是创建一个不关心数据类型的函数,则应该使用模板。
C++ 函数模板示例程序
以下示例 C++ 程序显示了如何使用模板。
#include <iostream>
using namespace std;
template<typename T>
T
AbsoluteValue(T tNumber)
{
return (tNumber>0)? tNumber:-tNumber;
}
int
main( void)
{
int nNumber1 = 7,
nNumber2 = -7;
cout<<"Absolute value of "
<<nNumber1<<" = "
<<AbsoluteValue(nNumber1)<<endl;
cout<<"Absolute value of "
<<nNumber2<<" = "
<<AbsoluteValue(nNumber2)<<endl;
double dNumber1 = 7.0923,
dNumber2 =-7.0923;
cout<<"Absolute value of"
<<dNumber1<<" = "
<<AbsoluteValue(dNumber1)<<endl;
cout<<“Absolute value of "
<<dNumber2<<" = "
<<AbsoluteValue(dNumber2)<<endl;
int iExit; cin>>iExit;
return EXIT_SUCCESS;
}
上述程序的输出如下:
Absolute value of 7 = 7
Absolute value of -7 = 7
Absolute value of 7.0923 = 7.0923
Absolute value of -7.0923 = 7.0923
正如你在上面的例子中看到的,它只有一个函数,但它会对任何数据类型做出反应。
正如我们已经看到如何使用模板函数来不关心数据类型,我们可以对 C++ 类使用相同的技巧。
如果您的 C++ 支持 C11 标准,您可以使用可变参数模板,它可以使用更多参数,例如模板和参数数量未知的函数的组合。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)