一、特化定义
特化:当类型是某些特殊类型时,来进行一些特殊的处理。
二、全特化
全特化即是将模版参数列表中所有的参数都确定化
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
template<class T1,class T2>
class Data
{
public:
Data() { cout << "Data<T1, T2>" << endl; }
private:
T1 _d1;
T2 _d2;
};
template<>
class Data<int, char>
{
public:
Data() { cout << "Data<int,char>" << endl; }
private:
int _d1;
char _d2;
};
void TestVector() {
Data<int, int> d1;
Data<int, char> d2;
}
int main() {
TestVector();
return 0;
}
可以看到,这里d2调用的是全特化的结果。
注意: 全特化不能单独存在,必须有原模板
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//template<class T1,class T2>
//class Data
//{
//public:
// Data() { cout << "Data<T1, T2>" << endl; }
//private:
// T1 _d1;
// T2 _d2;
//};
template<>
class Data<int, char>
{
public:
Data() { cout << "Data<int,char>" << endl; }
private:
int _d1;
char _d2;
};
void TestVector() {
Data<int, int> d1;
Data<int, char> d2;
}
int main() {
TestVector();
return 0;
}
(没有原特化的结果)
三、偏特化
将模版参数类表中的一部分参数特化,偏特化有以下两种表现形式:
3.1 部分特化
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
template<class T1,class T2>
class Data
{
public:
Data() { cout << "Data<T1, T2>" << endl; }
private:
T1 _d1;
T2 _d2;
};
template<class T1>
class Data<T1, int>
{
public:
Data() { cout << "Data<T1, int>" << endl; }
private:
T1 _d1;
int _d2;
};
void TestVector() {
Data<int, int> d1;
Data<int, char> d2;
}
int main() {
TestVector();
return 0;
}
可以看到,这里的d1调用的是偏特化。
(运行结果)
但需要注意的是,当全特化和偏特化重合时,会发生什么?
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
template<class T1,class T2>
class Data
{
public:
Data() { cout << "Data<T1, T2>" << endl; }
private:
T1 _d1;
T2 _d2;
};
template<class T1>
class Data<T1, int>
{
public:
Data() { cout << "Data<T1, int>" << endl; }
private:
T1 _d1;
int _d2;
};
template<>
class Data<int, char>
{
public:
Data() { cout << "Data<int,char>" << endl; }
private:
int _d1;
char _d2;
};
void TestVector() {
Data<int, int> d1;
Data<double, char> d2;
}
int main() {
TestVector();
return 0;
}
通过运行得知,其会匹配到全特化,因为全特化是最匹配的。
3.2参数进一步的限制
偏特化的本质是对参数的进一步限制。
例如限制参数为指针。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
template<class T1,class T2>
class Data
{
public:
Data() { cout << "Data<T1, T2>" << endl; }
private:
T1 _d1;
T2 _d2;
};
template<class T1>
class Data<T1, int>
{
public:
Data() { cout << "Data<T1, int>" << endl; }
private:
T1 _d1;
int _d2;
};
template<>
class Data<int, char>
{
public:
Data() { cout << "Data<int,char>" << endl; }
private:
int _d1;
char _d2;
};
template <typename T1,typename T2>
class Data<T1*, T2*>
{
public:
Data() { cout << "class Data<T1*, T2*>" << endl; }
private:
T1 _d1;
T2 _d2;
};
void TestVector() {
Data<int, int> d1;
Data<int, char> d2;
Data<double*, int*>d3;
}
int main() {
TestVector();
return 0;
}
(d3调用的就是指针方面的特化)
例如限制参数为引用。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
template<class T1,class T2>
class Data
{
public:
Data() { cout << "Data<T1, T2>" << endl; }
private:
T1 _d1;
T2 _d2;
};
template<class T1>
class Data<T1, int>
{
public:
Data() { cout << "Data<T1, int>" << endl; }
private:
T1 _d1;
int _d2;
};
template<>
class Data<int, char>
{
public:
Data() { cout << "Data<int,char>" << endl; }
private:
int _d1;
char _d2;
};
template <typename T1,typename T2>
class Data<T1*, T2*>
{
public:
Data() { cout << "class Data<T1*, T2*>" << endl; }
private:
T1 _d1;
T2 _d2;
};
template <typename T1, typename T2>
class Data<T1&, T2&>
{
public:
Data()
{ cout << "class Data<T1&, T2&>" << endl; }
private:
T1 _d1;
T2 _d2;
};
void TestVector() {
Data<int, int> d1;
Data<int, char> d2;
Data<double*, int*>d3;
Data<double&, int&> d4;
}
int main() {
TestVector();
return 0;
}
(d4调用的就是引用的构造)
四、函数模版
如果我实现了一个日期(Date)类,并实现了其比较函数。那么如果我们使用Date* 去比较呢?
template<class T>
bool Less(T left, T right) {
return left < right;
}
显然,现在需要特化一下,使Date*去专门去比较。
template<class T>
bool Less(T left, T right) {
return left < right;
}
template<>
bool Less <Date*>(Date * left, Date * right)
{
return *left < *right;
}
但我们推荐使用类模版的特化,而并不推荐使用函数模版的特化。