模板完全特例化和部分特例化

模板简单基础知识

#include<iostream>
template<typename T>
bool compare(T a, T b)
{
	std::cout << "bool compare(T a, T b)" << std::endl;
	return a > b;
}

template<>
bool compare<const char*>(const char* a,const char *b)
{ 
	std::cout << "bool compare<const char*>(const char* a,const char *b)" << std::endl;
	return strcmp(a, b);
}
int main()
{
	compare(10, 20);
	compare("aaa", "bbb");//T const char*
	return 0;
}

输出信息:

bool compare(T a, T b)
bool compare<const char*>(const char* a,const char *b)

完全特例化和部分特例化

/*
模板的完全特例化和非完全(部分)特例化
模板的实参推演
*/
template<typename T>
class Vector
{
public:
	Vector() { std::cout << "call Vector template init" << std::endl; }
};
//下面这个是char*类型提供的完全特例化版本
template<>
class Vector<char*>
{
public:
	Vector() { std::cout << "call Vector<char*> init" << std::endl; }
};

//下面这个是对指针类型提供的部分特例化版本
template<typename Ty>
class Vector<Ty*>
{
public:
	Vector() { std::cout << "call Vector<Ty*> init " << std::endl; }
};

//针对函数指针(有返回值,有两个形参变量)提供的部分特例化
template<typename R ,typename A1,typename A2>
class Vector<R(*)(A1, A2)>
{
public:
	Vector() { std::cout << "call Vector<R(*)(A1,A2)> init" << std::endl; }
};

//针对函数(有一个返回值,有两个形参变量)类型提供的部分特例化
template<typename R,typename A1,typename A2>
class Vector<R(A1, A2)>
{
public:
	Vector()
	{
		std::cout << "call Vector<R(A1,A2) init" << std::endl;
	}
};
int sum(int a, int b) { return a + b; }
int main()
{
	Vector<int> vec1;
	Vector<char*> vec2;
	Vector<int*> vec3;
	Vector<int(*)(int, int)> vec4;
	Vector<int(int, int)> vec5;

	//函数指针类型
	typedef int(*PFUNC1)(int, int);
	PFUNC1 pfunc1 = sum;
	std::cout << pfunc1(10, 20) << std::endl;

	//函数类型
	typedef int PFUNC2(int, int);
	PFUNC2* pfunc2 = sum;
	std::cout << (*pfunc2)(100, 200) << std::endl;
}

输出信息如下

call Vector template init
call Vector<char*> init
call Vector<Ty*> init
call Vector<R(*)(A1,A2)> init
call Vector<R(A1,A2) init
30
300

模板实参推演

#include<iostream>
#include<typeinfo>
/*
模板的完全特例化和非完全(部分)特例化
模板的实参推演
*/
//T包含了所有的大的类型 返回值,所有形参的类型都取出来
template<typename T>
void func(T a)
{
	std::cout << "void func(T a)" << std::endl;
	std::cout << typeid(T).name() << std::endl;
}
template<typename R,typename A1,typename A2>
void func2(R(*a) ( A1,  A2))
{
	std::cout << "void func2(R(*a) ( A1,  A2))" << std::endl;
	std::cout << typeid(R).name() << std::endl;
	std::cout << typeid(A1).name() << std::endl;
	std::cout << typeid(A2).name() << std::endl;
}
template<typename R,typename T,typename A1,typename A2>
void func3(R(T::* a)(A1, A2))
{
	std::cout << "void func3(R(T::* a)(A1, A2))" << std::endl;
	std::cout << typeid(R).name() << std::endl;
	std::cout << typeid(T).name() << std::endl;
	std::cout << typeid(A1).name() << std::endl;
	std::cout << typeid(A2).name() << std::endl;
}

class Test
{
public:
	int sum(int a, int b) { return a + b; };
};
int sum(int a, int b) { return a + b; }
int main()
{
	func(10);
	func("aaa");
	func(sum);//T int(__cdec1*)(int,int)
	func2(sum);
	func3(&Test::sum);

}

输出信息如下:

void func(T a)
int
void func(T a)
char const * __ptr64
void func(T a)
int (__cdecl*)(int,int)
void func2(R(*a) ( A1,  A2))
int
int
int
void func3(R(T::* a)(A1, A2))
int
class Test
int
int
posted @ 2025-10-26 20:40  焦涛  阅读(15)  评论(0)    收藏  举报