Typelist介绍

原创 2017年01月03日 16:16:49

简单的Typelist
typedef Typelist <int ,NullType> OneTypeOnly;
typedef Typelist <char,Typelist<signed char,Typelist<unsigned char,NullType> > >AllCharTypes;
利用宏包装
typedef TYPELIST_4(signed char,short int,int ,long int)SignedIntegrals;
计算长度
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 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;
};
查找Typelists
template<class TList,class T> struct IndexOf;
template<class T>
//结束位置 
struct IndexOf<NullType,T>
{
enum {value = -1};
};
//递归
template<class Tail ,class T>
struct IndexOf{Typelist<T,Tail>,T}
{
enum{value =0};
}
//入口
template<class Head,class Tail ,class T>
struct IndexOf<Typelist<Head,Tail>,T>
{
private:
enum{temp=IndexOf<Tail ,T>::value};
public:
enum{value= temp ==-1?-1:1+temp};
};
添加Typelists
template<class TList,clsss T>struct Append;
template<>struct Append<NullType,NullType>
{
typedef NullType Result;
};
template<class T >struct Append<NullType,T>
{
typedef TypeLIST_l(T) Result;
}
template<class Head,class Tail >
struct Append<NullType,Typelist<Head,Tail> >
{
typedef Typelist<Head,Tail>Result;
};
template<class Head,class Tail ,class T>
{
typedef Typelist<Head,typename Append<Tail ,T>::Result>
Result;
};
删除
template<class TList,class T> struct Erase;
template<class T>
//结束位置 
struct Erase<NullType,T>
{
typedef NullType Result;
};
//递归
template<class Tail ,class T>
struct Erase{Typelist<T,Tail>,T}
{
typedef Tail Result;
}
//入口
template<class Head,class Tail ,class T>
struct Erase<Typelist<Head,Tail>,T>
{
typedef Typelist<Head,typename Erase<Tail ,T>::Result>
Result;
};
删除所有指定的型别
template<class TList,class T> struct EraseAll;
template<class T>
//结束位置 
struct EraseAll<NullType,T>
{
typedef NullType Result;
};
//递归
template<class Tail ,class T>
struct EraseAll{Typelist<T,Tail>,T}
{
//typedef Tail Result;
typedef typename EraseAll<Tail ,T>:: Result Result
}
//入口
template<class Head,class Tail ,class T>
struct Erase<Typelist<Head,Tail>,T>
{
typedef Typelist<Head,typename Erase<Tail ,T>::Result>
Result;
};
移除所有重复元素
template<class TList> struct NoDuplicates;
template<>struct NoDuplicates<NullType>
{
typedef NullType Result;
}
template<class Head,class Tail>
struct NoDuplicates<Typelist<Head,Tail> >
{
private:
typedef typename NoDuplicates<Tail>::Result L1;
typedef typename Erase<L1,Head>::Result L2;
public:
typedef Typelist<Head,L2>Result;
};
替换元素
template<class TList,class T,class U> struct Replace;
template<class T,class U>
struct Replace<NullType,T,U>
{
typedef NullType Result;
};
template<class T,class Tail ,class U>
struct Replace <Typelist<T,Tail>,T,U>
{
typedef Typelist<U,Tail >Result;
};
template<class Head,class Tail ,class T,class U>
struct Replace <Typelist<Head,Tail>,T,U>
{
typedef Typelist<Head,typename Replace <Tail ,T,U>::Result>
Result;
};

template <class TList ,class T> struct MostDerived
 
//排序功能,关系公式SUPERSUBCLASS
template< class T >
struct MostDerived <NullType ,T>
{
 typedef Result;
};

template <class Head,class Tail,class T>
struct MostDerived <Typelist<Head,Tail>,T>
{
 private:
 typedef typename MostDerived<Tail ,T >::Result Candidate;
 public:
  typedef  typename Select <SUPERSUBCLASS(Candidate,Head),Head,Candidate>::Result Result;
}

template<class T >struct DerivedToFront;
template<>
struct DerivedToFront<NullType>
{
 typedef NullType Result;
};
template <class Head ,class Tail >
struct DerivedToFront<Typelist<Head,Tail> >
{
 private:
 typedef typename MostDerived <Tail ,Head>::Result TheMostDerived
 typedef typename Replace<Tail ,TheMostDerived ,Head>::Result L;
 public :
 typedef Typelist<TheMostDerived ,L>Result;
}
总结,递归,不同版本模仿处理


版权声明:本文为博主原创文章,未经博主允许不得转载。

Loki的TypeList技术解析

Loki源码分析之TypeList详解
  • davidsu33
  • davidsu33
  • 2014年04月01日 21:38
  • 933

使用模板元编程操作类型集合(C++11下的TypeList)

Wrote by mutouyun. (http://darkc.at/cxx-type-list/) 群里有个朋友要实现这么一个功能:如何在编译期把一个函数类型的参数减少一个。 简单来说...
  • markl22222
  • markl22222
  • 2014年05月28日 22:44
  • 1892

模板之Typelist的"增删改查"

1 Typelist 的索引式访问
  • renwotao2009
  • renwotao2009
  • 2014年11月20日 19:26
  • 758

自己做TypeList编写的测试Demo

自己编写的TypeListDemo,不错很好玩的东西#include #include #include using namespace std; struct NullType {}; t...
  • davidsu33
  • davidsu33
  • 2014年04月03日 08:44
  • 772

C++模板的高级用法中Typelist的用法

在Modern C++ Design中提到了很多关于模板的用法,给我印象最深的是Typelist,其他的主要是看不懂,所以不知道有什么用,所以这里不谈。 但是对于Typelist,书中讲述了如何...
  • blade_ly
  • blade_ly
  • 2013年02月01日 15:15
  • 369

如何介绍你的项目

项目问题APP 项目 一般面试官在面试过程中,让求职者讲一下之前的项目,好多学生只是仅仅把自己会的这些知识点说了出来,而遇到不会的了有学生就直接回答“那个模块不是我做”,但凡回这一句话的面试都没戏。...
  • qq_35827461
  • qq_35827461
  • 2016年11月30日 10:27
  • 2775

jQuery简单介绍

jQuery 库可以通过一行简单的标记被添加到网页中。jQuery 库 - 特性jQuery 是一个 JavaScript 函数库。 jQuery 库包含以下特性: HTML 元素选取 HTML...
  • Care_about
  • Care_about
  • 2016年10月24日 10:01
  • 465

JQuery 的简单介绍

JQuery的优势 强大的选择器 出色的DOM封装 可靠的事件处理机制 出色的浏览器兼容性 使用隐式迭代简化编程 丰富的插件支持 体积小,压缩后只有100KB左右 在页面中引入jQuery 首先需在...
  • wushuang3625
  • wushuang3625
  • 2017年03月12日 22:51
  • 247

mysql数据库入门(1)--各种数据库介绍

各种数据库介绍数据库介绍1. 什么是数据库    简单说存放数据的仓库,这个仓库按照一定的数据结构来组织、存储的,我们可以通过数据库提供的多种方法来管理数据库里 的数据     我们简单形象的理解...
  • u010472499
  • u010472499
  • 2016年11月04日 15:33
  • 1495

Spring MVC简单介绍

对SpringMVC框架介绍    The Spring Web model-view-controller (MVC) framework的设计是围绕一个分发期,将请求处理程序,可配置的处...
  • jiang_qing_kai
  • jiang_qing_kai
  • 2015年01月18日 18:58
  • 1039
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Typelist介绍
举报原因:
原因补充:

(最多只允许输入30个字)