c++函数模板

#include<iostream>
/*
* C++ 函数模板
* 模板的意义:对类型也可以进行参数化
* 
* 函数模板  《=是不进行编译的,因为类型还不知道
* 模板的实例化《=函数调用点
* 模板函数《=才是要编译器所编译的
* 
* 模板类型参数 typename/class
* 模板非类型参数
* 
* 模板的参数推演=>可以根据用户传入的实参的类型,来推导出模板类型参数的具体类型
* 模板的特例化(专用化) 特殊(不是编译器提供的,而是用户提供的)的实例化
* 函数模板、模板的特例化、非模板函数的重载关系
* 
* 模板代码是不能在一个文件中定义,在另外一个文件中使用的
* 模板代码调用之前,一定要看到模板定义的地方,这样的话,模板
* 才能够进行正常的实例化,产生能够被编译器编译的代码
* 所以,模板代码都是放在头文件当中的,然后在源文件当中直接进行include包含
*/

/*
在函数调用点,编译器用用户指定的类型,从原模板实例化一份函数代码出来
模板函数
bool compare<int>(int a,int b)
{
    return>b
}
bool compare<double>(double a,double b)
{
	return>b
}

bool compare<const char *>(const char * a,const char * b)
{
	return>b
}
*/

//函数模板 
template<typename T> //定义一个模板参数列表
bool compare(T a, T b)//compare 是一个函数模板
{
	std::cout << "template compare" << std::endl;
	return a > b;
}

//模板特例化
//针对compare函数模板,提供const char*类型的特例化版本
template<>
bool compare<const char*>(const char* a, const char* b)
{
	std::cout << "compare<const char*>" << std::endl;
	return strcmp(a, b) > 0;
}

//非模板函数-普通函数
bool compare(const char* a, const char* b)
{
	std::cout << "normal compare" << std::endl;
	return strcmp(a, b) > 0;
}

//函数模板
//模板的非类型参数  必须是整数类型(整数或者地址/引用都可以)都是常量,只能使用而不能修改
template<typename T, int SIZE>
void sort(T *arr)
{
	for (int i = 0; i < SIZE - 1; ++i)
	{
		for (int j = 0; j < SIZE - 1 - i; ++j)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = arr[j];
			}
		}
	}
}
int main()
{
	//函数调用点 
	compare<int>(10, 20);
	compare<double>(10.5, 20.5);

	//函数模板实参推演
	compare(20, 30);

	//将编译报错:
    //“compare”: 未找到匹配的重载函数
	//“bool compare(T,T)”: 模板 参数“T”不明确
	//compare(20, 30.5);

	//指定模板参数类型为int,但是会有警告warning C4244: “参数”: 从“double”转换到“T”,可能丢失数据
	compare<int>(20, 30.5);

	//函数模板实参的推演 T const char *
	//对于某些类型来说,依赖编译器默认实例化的模板代码,代码处理逻辑是有错误的
	//编译器优先把compare处理成函数名字,没有的话,才去compare模板
	compare("aaa", "bbb");
	compare<const char*>("aaa", "bbb");

	int arr[] = { 12,5,7,89,32,21,35 };
	const int size = sizeof(arr) / sizeof(arr[0]);
	sort<int,size>(arr);
	for (int val : arr)
	{
		std::cout << val << " " ;
	}
}

输出信息

template compare
template compare
template compare
template compare
normal compare
compare<const char*>
5 5 7 21 21 21 35
posted @ 2025-10-02 19:40  焦涛  阅读(7)  评论(0)    收藏  举报