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
,该函数可以处理任意支持小于运算符 <
的数据类型,像 int
、double
、float
等,提高了代码的复用性。
简洁性:代码结构简单,逻辑清晰,易于理解和维护。
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++中的函数模板,并通过一些示例来演示函数模板的使用。