面试题答案
一键面试#include <iostream>
// 函数模板定义
template<typename T, typename U>
auto maxValue(T a, U b) {
return (a > b)? a : b;
}
// 自定义类示例
class MyClass {
public:
int value;
MyClass(int val) : value(val) {}
bool operator>(const MyClass& other) const {
return value > other.value;
}
};
可以通过以下方式调用:
int main() {
// 基本数据类型调用
int intResult = maxValue(5, 3);
double doubleResult = maxValue(5.5, 3.3);
// 自定义类类型调用
MyClass obj1(10);
MyClass obj2(20);
MyClass classResult = maxValue(obj1, obj2);
std::cout << "Int max: " << intResult << std::endl;
std::cout << "Double max: " << doubleResult << std::endl;
std::cout << "MyClass max: " << classResult.value << std::endl;
return 0;
}
类型参数在函数模板定义和使用过程中的作用
- 定义过程:在函数模板定义
template<typename T, typename U>
中,T
和U
是类型参数。它们代表了函数模板可以接受的不同数据类型。通过使用这些类型参数,函数模板能够编写通用的代码,而不需要针对每种具体的数据类型重复编写代码。例如在maxValue
函数中,a
和b
的类型分别由T
和U
表示,函数体中的逻辑不依赖于具体的类型,只要T
和U
类型支持>
运算符,函数就能正确工作。 - 使用过程:在调用函数模板时,如
maxValue(5, 3)
,编译器会根据传入的实际参数类型自动推导类型参数T
和U
的具体类型。这里编译器会自动推导T
为int
,U
为int
。对于自定义类类型,只要类定义了>
运算符,也能正确推导类型参数并使用函数模板,如maxValue(obj1, obj2)
,编译器会推导T
和U
都为MyClass
。这种类型参数的自动推导特性极大地增强了函数模板的灵活性和易用性,使得代码可以适用于多种不同类型而无需显式指定类型。