函数模板

函数模板

函数模板是什么?

函数就像一个蛋糕模具,你放进去什么材料,就做出来什么样的蛋糕
本来我们要是想要创建一个比大小的函数,那么肯定需要把类型分开

int compare(int a,int b)
char compare(char a,char b)

函数模板的作用就是,通过写一个通用函数模板,让编译器自行检测调用的类型,然后再生成并调用对应类型版本的函数

template<typename T>         //template:声明模板参数  typename:告诉编译器T是一个类型名

简单函数模板使用

template<typename T>
T compare(T a, T b) {
	return a > b ? a : b;
}
int main() {
	int a = 1, b = 2;
	cout<<"int类型最大值为"<<compare(a, b)<<endl;

	char x = 'a', y = 'b';
	cout << "char类型最大值为" << compare(a, b)<<endl;
}

输出

int类型最大值为2
char类型最大值为2

函数模板可以有多个

template<typename T1,typename T2>
T1 add(T1 a, T2 b) {
    return a + b; 
}

int main() {
    cout << add(10, 3.14) << endl;
}

重载和模板一起使用

#include <iostream>
using namespace std;

template <typename T> 
T max_generic(T a, T b) {       //普通函数模板
    cout << "调用通用模板:";
    return a > b ? a : b;
}
int max_generic(int a, int b, int c) {     //函数重载
    cout << "调用3个int的重载函数:";
    return max_generic(max_generic(a, b), c);
}
int max_generic(int arr[], int len) {       //函数重载2
    cout << "调用int数组的重载函数:";
    int max_val = arr[0];
    for (int i = 1; i < len; i++) {
        max_val = max_generic(max_val, arr[i]);
    }
    return max_val;
}
int main() {
    cout << max_generic('a', 'b') << endl;
    cout << max_generic(3.14, 5.67) << endl;
    cout << max_generic(1, 9, 5) << endl;
    int arr[] = { 12, 45, 7, 33 };
    cout << max_generic(arr, 4) << endl;
}

输出

调用通用模板:b
调用通用模板:5.67
调用3个int的重载函数:调用通用模板:调用通用模板:9
调用int数组的重载函数:调用通用模板:调用通用模板:调用通用模板:45

编译器优先使用哪个版本?

#include <iostream>
#include <cstring>
using namespace std;

// 1. 普通函数:int类型精确匹配
int max_val(int a, int b) {
    cout << "普通函数(int):";
    return a > b ? a : b;
}
// 2. 通用模板
template <typename T>
T max_val(T a, T b) {
    cout << "通用模板:";
    return a > b ? a : b;
}
// 3. 显式具体化:const char*类型
template <>
const char* max_val(const char* a, const char* b) {
    cout << "显式具体化(const char*):";
    return strcmp(a, b) > 0 ? a : b;
}
int main() {
    // 优先级1:匹配普通函数的int精确匹配
    cout << max_val(10, 20) << endl;
    // 优先级2:匹配显式具体化的const char*精确匹配
    cout << max_val("apple", "banana") << endl;
    // 优先级3:匹配通用模板的隐式实例化(double精确匹配)
    cout << max_val(1.1, 2.2) << endl;
    // 优先级4:普通函数的隐式转换(char→int,匹配普通int函数)
    cout << max_val('a', 'b') << endl;
    return 0;
}

输出

普通函数(int):20
显式具体化(const char*):banana
通用模板:2.2
通用模板:b

这个一般不难判断,直觉调用什么函数应该就是什么函数,如果感觉没有可调用的函数基本有报错,或者逻辑不明确

posted @ 2026-01-28 19:43  努力的小xu  阅读(7)  评论(0)    收藏  举报