欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++模板的全特化和偏特化

程序员文章站 2024-01-14 17:40:22
...

C++模板的全特化与偏特化

全特化

全特化一般用于处理有特殊要求的类或者函数,此时依靠泛型模板无法处理这种情况。,因此全特化可以运用在类模板和函数模板当中。其模板参数列表为空。

template<>
class A<int, char>
{};
template<>
void func(int arg)
{}

偏特化

对部分参数进行指定初始化,类模板可以实现偏特化,而函数模板不能实现偏特化,因为和重载的概念相互冲突,而类不能重载,因此可以实现。

template<typename T>
class A<T, int>
{};

例子

类模板的特化和偏特化

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

//类模板
template <typename T1, typename T2>
class A
{
public:
	void func(void)
	{
		cout << "ordinary class initialize" << endl;
	}
};

//完全特化
template <>
class A<int, char>
{
public:
	void func(void)
	{
		cout << "Template class full specialization" << endl;
	}
};

//偏特化
template <typename T>
class A<T, int>
{
public:
	void func(void)
	{
		cout << "Partial template specialization <T, int>" << endl;	
	}
};

//偏特化
template <typename T>
class A<int, T>
{
public:
	void func(void)
	{
		cout << "Partial template specialization <int, T>" << endl;
	}
};

int main()
{
	/*
	A<int, int> obj;//这样会有多个进行匹配,也就是两个偏特化,错误
	obj.func();
	*/
	A<int, char> obj1;
	obj1.func();//Template class full specialization
	
	A<int, double> obj2;
	obj2.func();//Partial template specialization <int, T>

	A<string, int> obj3;
	obj3.func();//Partial template specialization <T, int>

	A<string, string> obj4;
	obj4.func();//ordinary class initialize
	return 0;
}

函数模板的特化

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

//函数模板
template <class T1, class T2>
void func(T1 arg1, T2 arg2)
{
	cout << "function template initialization" << endl;
}

//函数模板全特化
template <>
void func<int, char>(int arg, char ch)
{
	cout << "Template function full specialization" << endl;
}

//函数模板偏特化,错误,函数模板不能偏特化
//template <class T>
//void func<T, char>(T arg, char ch)
//{
//	cout << "Template function Partial specialization" << endl;
//}
/*
当然这里可以写作如下,这是可行的,但是本质是重载
template <class T>
void func(T arg, char ch)
{
	cout << "Template function Partial specialization" << endl;
}
*/

void func(int arg, char ch)
{
	cout << "function overload" << endl;
}

int main()
{
	func(1, 'c');//function overload
	func(1.0, 'c');//function template initialization
	func('c', 1);//function template initialization
	return 0;
}

总结

函数模板只能全特化,不能偏特化,这是因为函数模板的偏特化和重载相互冲突,都实现了相同的功能,简言之就是没必要。类模板二者都能
优先级:无模板函数 > 全特化/偏特化 > 普通模板

相关标签: C/C++知识