什么是模版特化
特化的含义:所谓特化,就是将泛型搞得具体化一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰(例如const或者摇身一变成为了指针之类的东东,甚至是经过别的模板类包装之后的模板类型)或完全被指定了下来。
函数模板的特化:当函数模板需要对某些类型进行特化处理,称为函数模板的特化。
类模板的特化:当类模板内需要对某些类型进行特别处理时,使用类模板的特化。
特化整体又分全特化与偏特化
全特化:全特化也就是定义了一个全新的类型,全特化的类中的函数可以与模板类不一样。
偏特化:就是模板中的模板参数没有被全部确定,需要编译器在编译时进行确定。
模板函数只能全特化,没有偏特化(以后可能有)。
模板类是可以全特化和偏特化的。
全特化的标志:template <>然后是完全和模板类型没有一点关系的类实现或者函数定义
偏特化的标志:template
怎么实现模版特化
这是一个函数模版
cpp
template <class T>
int compare(const T &left, const T&right)
{
std::cout <<"in template<class T>..." <<std::endl;
return (left - right);
}
我们对这个模版函数进行特化
cpp
template < >
int compare<const char*>(const char* left, const char* right)
{
std::cout <<"in special template< >..." <<std::endl;
return strcmp(left, right);
}
//第二种
template < >
int compare(const char* left, const char* right)
{
std::cout <<"in special template< >..." <<std::endl;
return strcmp(left, right);
}
函数模版特化的步骤:
必须要先有一个基础的函数模板
使用特换模板函数时格式有要求:
1、关键字template后面接一对空的尖括号<>
2、函数名<特化类型>(特化类型 参数1, 特化类型 参数2 , ...) 在函数名后跟<>其中写要特化的类型
函数形参表必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。
类模版特化步骤
类模板的特化:与函数模板类似,当类模板内需要对某些类型进行特别处理时,使用类模板的特化。
模板参数的类模板特化的几种类型
一是特化为绝对类型;
二是特化为引用,指针类型;
三是特化为另外一个类模板。
模版偏特化
模板偏特化是对模板的部分参数进行特化。它允许你针对模板参数的某些特定情况提供专门的实现,而不是完全特化所有的模板参数。
cpp
template <typename T1, typename T2>
class MyClass {
public:
void print() {
std::cout << "模板" << std::endl;
}
};
template <typename T1>
class MyClass<T1, int> {
public:
void print() {
std::cout << "T2 的部分特化为 int" << std::endl;
}
};
模板特化和偏特化使得 C++模板更加灵活,可以根据不同的类型和特定情况提供定制化的实现。