类模版的特化

文章介绍了C++中的模板特化,包括全特化(所有模板参数确定化)、偏特化(部分参数确定化)以及函数模板和类模板的特化应用场景。作者强调了类模板特化的优先性。
摘要由CSDN通过智能技术生成

一、特化定义

        特化:当类型是某些特殊类型时,来进行一些特殊的处理。

二、全特化

        全特化即是将模版参数列表中所有的参数都确定化

#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;
}

但我们推荐使用类模版的特化,而并不推荐使用函数模版的特化。 

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值