• 正文
  • 相关推荐
申请入驻 产业图谱

C++函数模板基础

05/09 14:40
854
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1 函数模板

1.1 基础介绍

函数模板是一种特殊的函数定义,它允许你创建通用的函数,这些函数可以处理多种不同的数据类型,而不需要为每种数据类型都编写一个单独的函数。

在 C++ 里,函数模板的格式包含模板声明函数定义两部分,其基本格式如下:

template?<typename?T>
返回类型 函数名(参数列表)?
{
? ??// 函数体
}

template 关键字:用来声明模板的起始标志

<typename T>:模板参数列表,定义了模板中使用的类型参数typename 是指定类型参数的关键字,也可以用?class 来替代,二者在功能上没有区别。T 是类型参数的名称,可以根据需要自定义,通常用?T 来表示 “类型(Type)”

返回类型:函数的返回值类型,可以是具体类型,也能是模板参数类型函数名:即函数的名称,遵循 C++ 标识符的命名规则即可参数列表:函数的参数列表,参数类型可以是具体类型,也可以是模板参数类型函数体:包含函数的具体实现代码

1.2 函数模板与模板函数

1.2.1 函数模板

函数模板的重点是模板。函数模板是一个抽象的定义,是创建通用函数的工具。

1.2.2 模板函数

模板函数则是函数模板实例化后的具体函数,用于处理特定类型的数据。

2 实例

由上面的函数模板的介绍,类型参数T可以在参数中使用,也可以在返回值中使用。

2.1 在参数和返回值中使用T

此函数模板?CalcMin?接收两个相同类型的参数?num1?和?num2,最终返回较小的那个值。

// 在参数和返回值中使用T
template?<typename?T>
T?CalcMin(T num1, T num2)
{
? ??return?num1 < num2 ? num1 : num2;
}

代码优势

通用性:借助模板参数?T,该函数可以处理任意支持小于运算符?< 的数据类型,像?intdoublefloat 等,提高了代码的复用性。

简洁性:代码结构简单,逻辑清晰,易于理解和维护。

2.2 在返回值中使用T

// 在返回值中使用T
template?<typename?T>
T?GetValue()
{
? ??return?T(5.68);
}

这个函数模板?GetValue?不接收任何参数,它的主要功能是返回一个由?T?类型构造的对象,该对象是通过将?5.68?进行类型转换得到的。

2.3 在参数中使用T

这是一个带有两个类型参数?T1?和?T2?的函数模板?SetValue。该函数接收两个不同类型的参数?para1?和?para2,并将它们的值输出到标准输出流,展示参数的具体内容。

// 在参数中使用T
template?<typename?T1,?typename?T2>
void?SetValue(T1 para1, T2 para2)
{
? ??std::cout?<<?"para1:"?<< para1 <<?", "?<<?"para2:"?<< para2 <<?std::endl;
}

代码优点

高度泛用性:借助模板参数?T1 和?T2,函数可以处理任意两种不同类型的参数组合,只要这些类型支持?<< 运算符用于输出到?std::cout。这极大地增强了代码的复用性,避免了为不同类型组合编写多个类似函数的麻烦。

灵活性:调用者可以自由地传入不同类型的参数,函数会根据实际传入的类型进行实例化。

2.4 完整示例代码

// g++ test1.cpp -std=c++11 -o test1
#include?<stdio.h>
#include?<iostream>

// 在参数和返回值中使用T
template?<typename?T>
T?CalcMin(T num1, T num2)
{
? ??return?num1 < num2 ? num1 : num2;
}

// 在返回值中使用T
template?<typename?T>
T?GetValue()
{
? ??return?T(5.68);
}

// 在参数中使用T
template?<typename?T1,?typename?T2>
void?SetValue(T1 para1, T2 para2)
{
? ??std::cout?<<?"para1:"?<< para1 <<?", "?<<?"para2:"?<< para2 <<?std::endl;
}

int?main()
{
? ??int?n1 =?5;
? ??int?n2 =?8;
? ??float?f1 =?6.6;
? ??float?f2 =?9.6;
? ??printf("min(%d,%d)=%dn", n1, n2, CalcMin(n1, n2));
? ??printf("min(%.2f,%.2f)=%.2fn", f1, f2, CalcMin(f1, f2));
? ??
? ??printf("get int %d(%.2f)n", GetValue<int>(), (float)(GetValue<int>()));
? ??printf("get float %.2fn", GetValue<float>());
? ??
? ? SetValue("6.89576",?"abcdefg");
? ??
? ??return0;
}

运行效果如下

3 总结

本篇介绍了C++中的函数模板,并通过一些示例来演示函数模板的使用。

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录