欢迎关注我的公众号 [极智视界],获取我的更多笔记分享
大家好,我是极智视界,本文介绍一下 C++模板函数。
模板函数是 C++ 中一种特殊的函数,它的类型参数列表用尖括号 <> 括起来,放在函数名的后面。使用模板函数,可以在编译时动态生成函数的版本,而不需要手动创建多个重载版本或者使用 void* 类型的参数来实现函数的泛型。
下面是一个简单的模板函数的例子,它可以找出两个数中的最大值:
template <typename T>
T max(T a, T b) {
return (a > b) ? a : b;
}
在调用这个函数时,必须指定类型参数 T 的实际类型,例如:
int m = max<int>(3, 7); // m 的值是 7
double x = max<double>(3.14, 2.72); // x 的值是 3.14
可以使用类型推断来简化函数调用,例如:
int m = max(3, 7); // m 的值是 7
double x = max(3.14, 2.72); // x 的值是 3.14
在这种情况下,编译器会自动推断出 T 的类型,并生成对应的函数版本。
模板函数不仅可以有一个类型参数,还可以有多个类型参数。例如,下面是一个模板函数,用于交换两个变量的值:
template <typename T, typename U>
void swap(T& x, U& y) {
T temp = x;
x = y;
y = temp;
}
模板函数还可以指定默认的类型参数值,例如:
template <typename T, typename U = int>
void func(T x, U y) {
// ...
}
在调用这个函数时,可以省略第二个类型参数 U 的实际类型,它会使用默认值 int,例如:
func(3.14, 7); // 第一个参数是 double 类型,第二个参数是 int 类型
模板函数可以有默认模板参数列表,但是必须位于模板参数列表的末尾。
模板函数可以被定义为内联函数,这样可以提高函数调用的效率。例如:
template <typename T>
inline T min(T a, T b) {
return (a < b) ? a : b;
}
模板函数的声明和定义可以分开,但是必须保证在使用模板函数之前,它已经被声明过了。例如:
// 模版函数的声明
template <typename T>
T max(T a, T b);
// 其他代码
// 模版函数的定义
template <typename T>
T max(T a, T b) {
return (a > b) ? a : b;
}
可以使用 extern 关键字来指定模板函数的定义在别的文件中,例如:
// 模版函数的声明
extern template int max<int>(int a, int b);
// 其他代码
在模板函数中,也可以使用特化来为某些特定的类型参数提供特殊的实现。特化是指为某个特定的类型参数创建一个专门的函数版本,并覆盖模板函数的通用版本。
例如,下面是一个模板函数,用于计算数组的平均值:
template <typename T>
T average(T* array, int size) {
T sum = 0;
for (int i = 0; i < size; i++) {
sum += array[i];
}
return sum / size;
}
这个函数的通用版本适用于所有的类型 T,但是对于浮点类型,可能希望使用更精确的算法来计算平均值。因此,可以为类型 T 为 float 或 double 的情况创建一个特化版本,例如:
template <>
float average(float* array, int size) {
// 使用更精确的算法计算平均值
// ...
}
template <>
double average(double* array, int size) {
// 使用更精确的算法计算平均值
// ...
}
在调用这个函数时,如果 T 为 float 或 double,就会使用这两个特化版本;否则使用通用版本。
好了,以上分享了 C++模板函数。希望我的分享能对你的学习有一点帮助。
【极智视界】
《极智编程 | C++模板函数》
搜索关注我的微信公众号「极智视界」,获取我的更多经验分享,让我们用极致+极客的心态来迎接AI !