Loki库学习1

/************************************************************************/
/* 
文件名: Loki库学习
创建人: Clark/陈泽丹
描述:	 
创建日期: 20111006
*/
/************************************************************************/
#include <iostream>

using namespace std;


class NullType {};
template <class T, class U>
struct Typelist
{
	typedef T Head;
	typedef U Tail;
};
template <class TList> struct Length; 
template <> struct Length<NullType>
{ 
	enum { value = 0 };
};
template <class T, class U> 
struct Length< Typelist<T, U> >
{
	enum { value = 1 + Length<U>::value };
};

template <class TList, unsigned int index> struct TypeAt;
template <class Head, class Tail>
struct TypeAt<Typelist<Head, Tail>, 0>
{//符合取头类型
	typedef Head Result;
};
template <class Head, class Tail, unsigned int i>
struct TypeAt<Typelist<Head, Tail>, i>
{//不符合取尾巴的类型
	typedef typename TypeAt<Tail, i - 1>::Result Result;
};


template <class TList, unsigned int index,typename DefaultType = NullType>
struct TypeAtNonStrict
{//加入DefaultType,当所有类型都偏特化不成功时,则以普通类型的值出现
	//DefaultType用于设定找不到时的返回值
	typedef DefaultType Result;
};
template <class Head, class Tail, typename DefaultType>
struct TypeAtNonStrict<Typelist<Head, Tail>, 0, DefaultType>
{
	//DefaultType是偏特化的语法要求,不是递归算法的因素
	typedef Head Result;
};
template <class Head, class Tail, unsigned int i, typename DefaultType>
struct TypeAtNonStrict<Typelist<Head, Tail>, i, DefaultType>
{
	//typename的作用是告诉编译器其后的实体是类型,DefaultType是偏特化的语法要求,不是递归算法的因素
	typedef typename TypeAtNonStrict<Tail, i - 1, DefaultType>::Result Result;
};

void main()
{
	cout<<Length<Typelist<int,Typelist<bool,Typelist<char,NullType> > > >::value<<endl;
	cout<<sizeof(TypeAt<Typelist<int,Typelist<bool,Typelist<char,NullType> > >, 0>::Result)<<endl;
	cout<<sizeof(TypeAtNonStrict<Typelist<int,Typelist<bool,Typelist<char,NullType> > >, 5>::Result)<<endl;
	cout<<sizeof(TypeAtNonStrict<Typelist<int,char>,0>::Result)<<endl;

	cout<<"------"<<endl;
	cout<<sizeof(TypeAtNonStrict<int,0>::Result)<<endl;
	system("pause");
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值