📜  函数模板 c++ (1)

📅  最后修改于: 2023-12-03 14:50:10.710000             🧑  作者: Mango

函数模板

函数模板是指在函数定义中使用一些类型参数的函数。函数模板可以减少代码重复,使得程序更加灵活。

语法:

template <class T>
return_type function_name(parameter_list) {
    // function body
}

其中,template<class T>是类型参数声明,在函数体中可以使用类型Treturn_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得到一个整数和一个浮点数中的较大值,编译器会自动根据实参类型推导出使用哪个模板。