C++模板的全特化和偏特化
程序员文章站
2024-01-14 17:40:22
...
全特化
全特化一般用于处理有特殊要求的类或者函数,此时依靠泛型模板无法处理这种情况。,因此全特化可以运用在类模板和函数模板当中。其模板参数列表为空。
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;
}
总结
函数模板只能全特化,不能偏特化,这是因为函数模板的偏特化和重载相互冲突,都实现了相同的功能,简言之就是没必要。类模板二者都能
优先级:无模板函数 > 全特化/偏特化 > 普通模板