用示例程序解读 C++ 模板函数

举报
Tiamo_T 发表于 2021/09/28 19:54:36 2021/09/28
【摘要】 让我们假设我们需要创建一个计算数字绝对值的函数。当你有一个正数时,这个数的绝对值就是同一个数,但是如果这个数是负数,那么这个数的绝对值就是符号改变的那个数。因此,如果您使用 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200