📅  最后修改于: 2023-12-03 14:50:10.710000             🧑  作者: Mango
函数模板是指在函数定义中使用一些类型参数的函数。函数模板可以减少代码重复,使得程序更加灵活。
语法:
template <class T>
return_type function_name(parameter_list) {
// function body
}
其中,template<class T>
是类型参数声明,在函数体中可以使用类型T
,return_type
表示函数返回类型,function_name
是函数名,parameter_list
是函数参数列表。
函数模板的使用与普通函数的调用方式基本相同,只是需要在函数名后面加上<T>
(例如function_name<T>(args)
)来指定类型参数,编译器会自动根据具体参数类型推导出T
的实际类型。
示例代码:
#include <iostream>
template<class T>
T max(T a, T b) {
return a > b ? a : b;
}
int main() {
std::cout << max<int>(3, 4) << std::endl; // 输出4
std::cout << max<double>(2.5, 6.8) << std::endl; // 输出6.8
return 0;
}
在以上代码中,我们定义了一个函数模板max
,可以比较两个数的大小,并返回其中较大的一个。在main
函数中,我们使用max<int>
得到两个整数中的较大值,并使用max<double>
得到两个浮点数中的较大值。
如果函数模板中只使用了一个类型参数,那么在调用函数时可以省略<T>
,编译器会根据实参的类型自动推导出类型参数。
示例代码:
#include <iostream>
template<class T>
void print(T val) {
std::cout << val << std::endl;
}
int main() {
print(123); // 自动推导类型为int
print(3.14); // 自动推导类型为double
return 0;
}
以上代码中,我们定义了一个函数模板print
,用于输出一个值,不需要指定类型参数,编译器会自动推导出类型。
与普通函数一样,函数模板也可以进行重载。当有多个函数模板的函数体是相同或者只用类型参数不同的时候,我们可以将这些函数模板合并成一个函数。由于类型参数不同,编译器会根据实参自动推导出合适的模板并进行调用。
示例代码:
#include <iostream>
template<class T>
T max(T a, T b) {
return a > b ? a : b;
}
template<class T1, class T2>
T1 max(T1 a, T2 b) {
return a > b ? a : b;
}
int main() {
std::cout << max(3, 4) << std::endl; // 自动推导类型为int,输出4
std::cout << max(2.5, 6.8) << std::endl; // 自动推导类型为double,输出6.8
std::cout << max(9, 2.4) << std::endl; // 自动推导类型为int,输出9
return 0;
}
在以上代码中,我们定义了两个函数模板max
,一个用于比较两个相同类型的数据,另一个用于比较两个不同类型的数据。在main
函数中,我们分别使用max<int>
和max<double>
得到两个整数/浮点数中的较大值,同时使用max
得到一个整数和一个浮点数中的较大值,编译器会自动根据实参类型推导出使用哪个模板。