泛化基础-模板的偏特化

c++的模板具备非常的超能力,能将通用的东西模板化,而由模板技术衍生出来的三大库又是那么的神奇(BOOST LOKI STL),而模板所能做的工作远远不止于这些,如果大家熟悉BOOST的元编程,就可以看出为了能降低程序的计算时间,将其转移至编译器,由编译器来进行计算。模板编程的课伸缩性非常好,给我们的编程带来了很大的帮助,更主要的是在编译器对我们的帮助。这里我给大家简单介绍一下模板一个很重要的入门技术,模板的偏特化。所谓模板的偏特化,其实是两个部分,一个是部分特化,一个是全部特化。部分偏化表示模板参数中有一部分被现有的类型所实现,而全部特化则是将所有的类型由现有的类型实现。

如下例子

#include <iostream>
#include <cassert>

using namespace std;

template<class T, class U>
class GenericBase
{
public:
	static enum {value = 0,};
};

//部分特化
template<class U>
class GenericBase<int, U>
{
public:
	static enum {value = 1,};
};

//部分特化
template<class T>
class GenericBase<T, char>
{
public:
	static enum {value = 2,};
};

//全部特化
template<>
class GenericBase<int, char>
{
public:
	static enum {value = 3,};
};

template<class T = void>
class NullType {};

int _tmain(int argc, _TCHAR* argv[])
{
	//In MSVC NullType need to be NullType<>
	int value0 = GenericBase<NullType<>, NullType<>>::value;
	int value1 = GenericBase<int, NullType<>>::value;
	int value2 = GenericBase<NullType<>, char>::value;
	int value3 = GenericBase<int, char>::value;

	assert(value0 == 0);
	assert(value1 == 1);
	assert(value2 == 2);
	assert(value3 == 3);

	std::cout<<"test has passed!"<<std::endl;
	char c = getchar();

	return 0;
}

另外我们通常会遇到要判断两个类型是否相同的问题,这个时候我们可以用模板的偏特化的性质来解决,如下例子

#include <iostream>
#include <cassert>

using namespace std;

//第一种实现方法
template<class T, class U>
struct is_same_type
{
	static const bool value = false;
};

template<class T>
struct is_same_type<T, T>
{
	static const bool value = true;
};

//第二中实现方法
template<class T, class U>
struct is_same2
{
	template<class T>
	struct InStruct
	{
		static const bool value = false;
	};

	template<>
	struct InStruct<T>
	{
		static const bool value = true;
	};

	static const bool value = InStruct<U>::value;
};

//------------------------------------------------------------
template<class T>
struct is_int
{
	static const bool value = false;
};

template<>
struct is_int<int>
{
	static const bool value = true;
};

//---------------------------------------------------------------
template<class T>
struct is_double
{
	static const bool value = false;
};

template<>
struct is_double<double>
{
	static const bool value = true;
};

//-------------------------------------------------------
template<class T = void>
struct NullType
{
	typedef T param_type;
};

int _tmain(int argc, _TCHAR* argv[])
{
	//In MSVC NullType need write to be NullType<> to use default type
	assert((!is_same_type<double, int>::value));
	assert((is_same_type<double, double>::value));
	assert((!is_same2<double,int>::value));
	assert((is_same2<int, int>::value));

	assert((is_int<int>::value));
	assert((!is_int<double>::value));
	assert((!is_int<NullType<>>::value));

	assert((!is_double<int>::value));
	assert((is_double<double>::value));
	assert((!is_double<NullType<>>::value));

	std::cout<<"test passed!";
	char c = getchar();

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值