c++ 泛型编程 之 TypeLists

完整代码 在

http://download.csdn.net/detail/zhuyingqingfen/8457091

关于 C++ 泛型中的 TypeTraits ,参考 c++ 泛型编程 之 TypeTraits

#ifndef TYPE_LISTS_H_
#define TYPE_LISTS_H_

#include <iostream>
#include <string>
#include "typetraits.h"

/*
TypeLists 内部没有任何数值(value),他们的实体是空的,不含有任何状态,也未定义任何函数。
执行期间TypeLists也不带任何数值,他们存在的理由只是为了携带型别信息。TypeLists 并未打算被具
现化。因此,当我们说“a TypeListL”,实际指的是一个typelist型别,不是一个typelist 对象。
规定 typelist 必须以NullType(类)结尾,NullType可被视为一个结束符号,类似于c字符串的\0功能,
定义一个只有一个元素的typelist如下:
typedef Typelist<int,NullType> OneTypeOnly.
*/
template<class T,class U>
struct Typelist
{
	typedef T Head;
	typedef U Tail;
};
//通过定义宏 将typelist线性化
#define TYPELIST_0() NullType
#define TYPELIST_1(T1) Typelist<T1,TYPELIST_0()>
#define TYPELIST_2(T1,T2) Typelist<T1,TYPELIST_1(T2)>
#define TYPELIST_3(T1,T2,T3) Typelist<T1,TYPELIST_2(T2,T3)>
#define TYPELIST_4(T1,T2,T3,T4) Typelist<T1,TYPELIST_3(T2,T3,T4)>
#define TYPELIST_5(T1,T2,T3,T4,T5) Typelist<T1,TYPELIST_4(T2,T3,T4,T5)>

//计算TypeList长度
//大多数Typelist的操作都是基于递归,递归终止条件通过模板特化实现。
template<class TList>struct Length;
template<>struct Length<NullType>//Length的全特化,即,只匹配NullType。
{
	enum{value = 0};
};
template<class T,class U>
struct Length<Typelist<T,U> >//Length的扁特化,可匹配任何TypeList<T,U>类型,包括U同时也是Typelist的复合情况。
{
	enum{value = 1+Length<U>::value};
};
//2 索引式访问
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;
};

//类似TypeAt功能,不过TypeAtNonStrict对逾界访问更加宽容。
//比如TypeList的个数是3,那么你不能使用TypeAt<TL3,3>::Result,这样会编译错误。
//但是TypeAtNonStrict<TL3,3,NullType>::Result可以,如果不存在索引为3的type,那么结果是第三个引数即NullType
template <class TList, unsigned int i, typename DefType = NullType>
struct TypeAtNonStrict
{
	typedef DefType Result;
};
template <class T, class U, typename DefType>
struct TypeAtNonStrict< Typelist<T, U>, 0, DefType >
{
	typedef T Result;
};
template <class T, class U, unsigned int i, typename DefType>
struct TypeAtNonStrict< Typelist<T, U>, i, DefType >
{
	typedef typename TypeAtNonStrict<U, i - 1, DefType>::Result Result;
};

//3 查找TypeList
template<class TList,class T> struct IndexOf;//声明
template<class T>
struct IndexOf<NullType,T>//如果TList为NullType,那么令value = -1;
{
	enum{value = -1};
};
template<class Tail,class T>
struct IndexOf<Typelist<T,Tail> ,T>//如果T是TList中的头端,那么令value= 0;
{
	enum{value = 0};
};
template<class Head,class Tail,class T>//将IndexOf施于TList尾端和T,并将结果置于一个临时变量temp
struct IndexOf<Typelist<Head,Tail> ,T>//如果temp为-1,令value为-1,否则令value为1+temp
{
private:
	enum{temp = IndexOf<Tail,T>::value};//temp要先于value声明定义。
public:
	enum{value = temp == -1 ? -1 : temp + 1};
};

//4 附加元素到typelist
template <class Tlist,class T>struct Append;//声明
template<>struct Append<NullType,NullType>//如果TList是NULL而且T是NULL,那么令Result为NullType
{
	typedef NullType Result;
};
template <class T> struct Append<NullType,T> //如果TList是NullType,且T是type(非typelist),
{                                           //那么Result将是"只含有唯一元素的T";
	typedef TYPELIST_1(T) Result;
};
template <class Head,class Tail>
struct Append<NullType,Typelist<Head,Tail> >// 如果TList是NullType,且T是一个typelist,那么Result便是T本身
{
	typedef Typelist<Head,Tail> Result;
};
template<class Head,class Tail,class T>//否则,如果Tlist是non-null,那么result将是个typelist,以TList::Head
struct Append<Typelist<Head,Tail>,T>   //为起头端,并以T附加到TList::Tail的结果为其尾端。
{
	typedef Typelist<Head,typename Append<Tail,T>::Result> Result;
};

//5 Reverse
template <class TList> struct Reverse;
template <>struct Reverse<NullType>
{
	typedef NullType Result;
};
template <class Head, class Tail>
struct Reverse< Typelist<Head, Tail> >
{
	typedef typename Append<
		typename Reverse<Tail>::Result, Head>::Result Result;
};

#endif

测试

void typelists_test()
{
	typedef TYPELIST_0() TL0;
	typedef TYPELIST_3(char,int,double) TL3;
	typedef TYPELIST_3(char,int,double) TL3_1;
	//Length
	std::cout<<Length<TL0>::value<<std::endl;
	std::cout<<Length<TL3>::value<<std::endl;

	//TypeAt
	typedef TypeAt<TL3,0>::Result Parm1;
	typedef TypeAt<TL3,1>::Result Parm2;
	typedef TypeAt<TL3,2>::Result Parm3;

	typedef TypeAtNonStrict<TL3,3,EmptyType>::Result TEST_TYPE;

	std::cout<<"Parm1 Type:"<<typeid(Parm1).name() <<" sizeof : "<< sizeof(Parm1)<<std::endl;
	std::cout<<"Parm2 Type:"<<typeid(Parm2).name() <<" sizeof : "<< sizeof(Parm2)<<std::endl;
	std::cout<<"Parm3 Type:"<<typeid(Parm3).name() <<" sizeof : "<< sizeof(Parm3)<<std::endl;
	std::cout<<"TEST_TYPE Type:"<<typeid(TEST_TYPE).name() <<" sizeof : "<< sizeof(TEST_TYPE)<<std::endl;

	//IndexOf
	std::cout<<"char indexof TL3 :"<<IndexOf<TL3,char>::value<<std::endl;
	std::cout<<"int indexof TL3 :"<<IndexOf<TL3,int>::value<<std::endl;
	std::cout<<"float indexof TL3 :"<<IndexOf<TL3,float>::value<<std::endl;

	//Append
	typedef Append<TL3,int> TL4;//TL4不是一个TypeList
	typedef Append<TL3_1,TYPELIST_2(float,double)> TL5;
	std::cout<<"TL4 Length  :"<<Length<TL4::Result>::value<<std::endl;
	std::cout<<"TL5 Length  :"<<Length<TL5::Result>::value<<std::endl;

	//Reverse
	std::cout<<"Reverse result:"<<typeid(Reverse<TL3>::Result).name()<<std::endl;
}
时间: 2024-08-03 05:56:56

c++ 泛型编程 之 TypeLists的相关文章

c++ 泛型编程 之 自动生成代码

http://download.csdn.net/detail/zhuyingqingfen/8457091 关于 C++ 泛型中的 TypeList ,参考  c++ 泛型编程 之 TypeLists #ifndef GENSCATTERHIERARCHY_H_ #define GENSCATTERHIERARCHY_H_ #include "typelists.h" #include "typetraits.h" #if defined(_MSC_VER) &a

C++ 模板与泛型编程

<C++ Primer 4th>读书笔记 所谓泛型编程就是以独立于任何特定类型的方式编写代码.泛型编程与面向对象编程一样,都依赖于某种形式的多态性. 面向对象编程中的多态性在运行时应用于存在继承关系的类.我们能够编写使用这些类的代码,忽略基类与派生类之间类型上的差异. 在泛型编程中,我们所编写的类和函数能够多态地用于跨越编译时不相关的类型.一个类或一个函数可以用来操纵多种类型的对象. 面向对象编程所依赖的多态性称为运行时多态性,泛型编程所依赖的多态性称为编译时多态性或参数式多态性. 模板是泛型

java泛型编程

一般的类和方法都是针对特定数据类型的,当写一个对多种数据类型都适用的类和方法时就需要使用泛型编程,java的泛型编程类似于C++中的模板,即一种参数化类型的编程方法,具体地说就是将和数据类型相关的信息抽象出来,主要提供通用的实现和逻辑,和数据类型相关的信息由使用时参数决定. 一.泛型类: 栈的实现 示例代码: package com.genericity; import org.junit.Test; /** * @Title: LinkedListStack.java * @Package c

C++中模板与泛型编程

目录 定义一个通用模板 模板特化和偏特化 模板实例化与匹配 可变参数模板 泛型编程是指独立与任何类型的方式编写代码.泛型编程和面向对象编程,都依赖与某种形式的多态.面向对象编程的多态性在运行时应用于存在继承关系的类,一段代码可以可以忽略基类和派生类之间的差异.在泛型编程中,编写的代码可以用作多种类型的对象.面向对象编程所依赖的多态性称为运行时多态性,泛型编程所依赖的多态性称为编译时多态性或参数式多态性. 1 模板定义 1.1 函数模板 模板定义以关键字 template 开始,后接模板形参表,模

泛型编程(模板)

;泛型编程 即是广泛的类型编程的意思,常常用于那些函数重复编写但只有参数类型或者返回值不同,常用泛型编程解决,C语言呢用宏解决 ;c++实现泛型编程用templeate模板来实现,其实就是代码的复制,当编译器扫描到模板初始化语法那么就会在当前文件中实例化一个函数或者类到本文件中,实例化的模板是存在实体的所以可以调试,而模板是不存在实体的,宏替换之后也不存在实体 函数模板(只写函数的实现而不关心其类型,类型通过外部初始化的时候增加一个叫做类型的参数来初始化一个函数模板或者类模板), 定义:每个函数

【C/C++学院】(11)泛型编程/函数模板/类模板

1.泛型编程基础 #include "iostream" using namespace std; void swap(int &a, int &b) { int c; c = a; a = b; b = c; } void swap(float &a, float &b) { float c; c = a; a = b; b = c; } void main() { int a = 1, b = 2; swap(a, b); float a1 = 1,

C++ Primer 学习笔记_77_模板与泛型编程 --实例化

模板与泛型编程 --实例化 引言: 模板是一个蓝图,它本身不是类或函数.编译器使用模板产生指定的类或函数的特定版本号.产生模板的特定类型实例的过程称为实例化. 模板在使用时将进行实例化,类模板在引用实际模板类型时实例化,函数模板在调用它或用它对函数指针进行初始化或赋值时实例化. 1.类的实例化 当编写Queue<int>qi时,编译器自己主动创建名为Queue<int>的类.实际上,编译器通过又一次编写Queue模板,用类型int取代模板形參的每次出现而创建Queue<int

Swift语言中的泛型编程 【Generic】【Part 1】

泛型  泛型编程让你可以编写更具扩展性.易重用的功能,代码使用时的类型取决于你所定义的业务需求.你可以编写避免重复的代码,目标更加清晰明确,风格抽象. 泛型是Swift语言的一项强大的特性,基本上所有的swift标准库都建立在泛型代码上.实际上,你在这本书的时候不知不觉地接触到泛型,它贯穿始终.例如Swift的数组和字典类型都是泛型集合.你可以创建用于存放整数值的数组,也创建数组存储字符串,其他所有能在Swift中创建的类型都可以创建到数组中.类似的,你可以创建字典来存储数值或其他指定的类型,毫

c#2.0锐利体验《泛型编程》读书笔记

1.c#泛型及机制 ? 1 2 3 4 5 6 Class Stack<T> { } T 其实为type的缩小,不过也可为其他字符代替T ,被称为"泛型类型"  T为晚绑定的,在编译的时候还不能确定T的确切类型. 2.泛型类型 3. c#2.0锐利体验<泛型编程>读书笔记,布布扣,bubuko.com