最近看了C++11的一些特性,最感兴趣的是可变模板参数,自动类型推断和匿名函数。

Loki中的TypeList,是需要递归定义的,并且需要一个NullType作为尾节点。

可变模板参数使得实现TypeList更简洁,更易懂。

以下是我用C++11实现TypeList,其实只用了可变模板参数。

去掉了递归定义,特别是尾节点可直接使用typelist<>,使得整个语义很美。

    //////////////////////////////////////////////////////////
template<typename... TList>
struct typelist
{
}; typedef typelist<> nulllist; //////////////////////////////////////////////////////////
template<typename... TList> struct length; template<typename... TList>
struct length< typelist<TList...> >
{
enum { value = sizeof...(TList) };
}; //////////////////////////////////////////////////////////
template<typename T, typename... TList> struct push_front; template<typename T, typename... TList>
struct push_front< T, typelist<TList...> >
{
typedef typelist<T, TList...> type;
}; //////////////////////////////////////////////////////////
template<typename... TList> struct pop_front; template<typename T, typename... TList>
struct pop_front< typelist<T, TList...> >
{
typedef typelist<TList...> type;
}; template<>
struct pop_front< nulllist >
{
typedef nulllist type;
}; //////////////////////////////////////////////////////////
template<unsigned int N, typename... TList> struct at; template<unsigned int N, typename T, typename... TList>
struct at< N, typelist<T, TList...> >
{
typedef typename at< N-, typelist<TList...> >::type type;
}; template<typename T, typename... TList>
struct at< , typelist<T, TList...> >
{
typedef T type;
}; template<>
struct at< , nulllist >
{
typedef nulllist type;
}; //////////////////////////////////////////////////////////
template<int A, int B>
struct IndexFixer
{
enum { value = (A == B) ? B : A + };
}; //////////////////////////////////////////////////////////
template<typename T, typename... TList> struct indexof; template<typename T, typename H, typename... TList>
struct indexof< T, typelist<H, TList...> >
{
enum { value = IndexFixer<indexof<T, typelist<TList...>>::value, ->::value };
}; template<typename T, typename... TList>
struct indexof< T, typelist<T, TList...> >
{
enum { value = };
}; template<typename T>
struct indexof< T, nulllist >
{
enum { value = - };
}; //////////////////////////////////////////////////////////
template<typename A, typename B> struct concat; template<typename... A, typename... B>
struct concat<typelist<A...>, typelist<B...> >
{
typedef typelist<A..., B...> type;
}; template<typename T, typename... TList>
struct concat<typelist<TList...>, T >
{
typedef typelist<TList..., T> type;
}; template<typename T, typename... TList>
struct concat< T, typelist<TList...> >
{
typedef typelist<T, TList...> type;
}; //////////////////////////////////////////////////////////
template<typename T, typename... TList> struct erase; template<typename T, typename H, typename... TList>
struct erase<T, typelist<H, TList...> >
{
typedef typename concat<H, typename erase< T, typelist<TList...> >::type>::type type;
}; template<typename T, typename... TList>
struct erase<T, typelist<T, TList...> >
{
typedef typelist<TList...> type;
}; template<typename T>
struct erase<T, nulllist >
{
typedef nulllist type;
}; //////////////////////////////////////////////////////////
template<typename T, typename... TList> struct erase_all; template<typename T, typename H, typename... TList>
struct erase_all<T, typelist<H, TList...> >
{
typedef typename concat<H, typename erase_all< T, typelist<TList...> >::type>::type type;
}; template<typename T, typename... TList>
struct erase_all<T, typelist<T, TList...> >
{
typedef typename erase_all< T,typelist<TList...> >::type type;
}; template<typename T>
struct erase_all<T, nulllist >
{
typedef nulllist type;
}; //////////////////////////////////////////////////////////
template<typename T, typename...TList> struct no_duplicate; template<typename T, typename...TList>
struct no_duplicate< typelist<T, TList...> >
{
private:
typedef typename no_duplicate< typelist<TList...> >::type inner;
typedef typename erase<T, inner>::type inner_result;
public:
typedef typename concat<T, inner_result>::type type;
}; template<>
struct no_duplicate< nulllist >
{
typedef nulllist type;
}; //////////////////////////////////////////////////////////
template<typename R, typename T, typename...TList> struct replace; template<typename R, typename T, typename H, typename...TList>
struct replace<R, T, typelist<H, TList...> >
{
typedef typename concat<H, typename replace<R, T, typelist<TList...>>::type>::type type;
}; template<typename R, typename H, typename...TList>
struct replace<R, H, typelist<H, TList...> >
{
typedef typename concat<R, typelist<TList...> >::type type;
}; template<typename R, typename T>
struct replace<R, T, nulllist >
{
typedef nulllist type;
}; //////////////////////////////////////////////////////////
template<typename R, typename T, typename...TList> struct replace_all; template<typename R, typename T, typename H, typename...TList>
struct replace_all<R, T, typelist<H, TList...> >
{
typedef typename concat<H, typename replace_all<R, T, typelist<TList...>>::type>::type type;
}; template<typename R, typename H, typename...TList>
struct replace_all<R, H, typelist<H, TList...> >
{
typedef typename concat<R, typename replace_all<R, H, typelist<TList...>>::type >::type type;
}; template<typename R, typename T>
struct replace_all<R, T, nulllist >
{
typedef nulllist type;
}; //////////////////////////////////////////////////////////
template<typename T, typename...TList> struct reverse; template<typename T, typename...TList>
struct reverse<typelist<T, TList...> >
{
typedef typename concat<typename reverse<typelist<TList...>>::type, T>::type type;
}; template<>
struct reverse< nulllist >
{
typedef nulllist type;
};

例子:

#include <iostream>
#include <vector>
#include "TypeList.h"
#include <type_traits> int main()
{
typedef typelist<int, float, bool, float> testlist;
typedef typelist<float, bool> tlist;
typedef typelist<int, float> hlist;
typedef typelist<> elist;
typedef typelist<int> ilist;
typedef testlist mylist; std::cout << "length: " << length<mylist>::value << std::endl;
bool b;
b = std::is_same<at<, mylist>::type, bool>::value;
std::cout << "is same: " << b << std::endl;
b = std::is_same<push_front<int, elist>::type, ilist>::value;
std::cout << "is same: " << b << std::endl;
std::cout << "indexof : " << indexof<bool, mylist>::value << std::endl;
b = std::is_same<pop_front<typelist<>>::type, pop_front<ilist>::type>::value ;
std::cout << "is same: " << b << std::endl;
b = std::is_same< erase<bool, mylist>::type, typelist<int, float, float>>::value;
std::cout << "is same: " << b << std::endl;
b = std::is_same< no_duplicate<mylist>::type, typelist<int, float, bool>>::value;
std::cout << "is same: " << b << std::endl;
b = std::is_same< replace<double, bool, mylist>::type, typelist<int, float, double, float>>::value;
std::cout << "is same: " << b << std::endl;
b = std::is_same< replace_all<double, float, mylist>::type, typelist<int, double, bool, double>>::value;
std::cout << "is same: " << b << std::endl;
b = std::is_same< reverse<mylist>::type, typelist<float, bool, float, int>>::value;
std::cout << "is same: " << b << std::endl; //std::cout << "is same: " << CompileTimeCount(int) << std::endl;
//std::cout << "is same: " << CompileTimeCount(int) << std::endl;
return ;
}

使用c++11改写loki的TypeList的更多相关文章

  1. 2018-2019-2-20175303 实验二 《Java开发环境的熟悉》实验报告

    2018-2019-2-20175303 实验二 <Java开发环境的熟悉>实验报告 姓名:柴轩达       学号:20175303     班级:1753       实验课程:JAV ...

  2. Struts2 (上)

    Struts2简介 Struts2框架的作用 Struts2是一个基于MVC设计模式的Web应用框架 它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controlle ...

  3. MySQL实战45讲学习笔记:第十讲

    一 .本节内容概要 前面我们介绍过索引,你已经知道了在 MySQL 中一张表其实是可以支持多个索引的.但是,你写 SQL 语句的时候,并没有主动指定使用哪个索引.也就是说,使用哪个索引是由MySQL ...

  4. 三大框架 之 Struts2

    目录 Struts2 Struts2简介 Struts2框架的作用 常见web层的框架 web框架特点 Struts2基本使用 Struts2执行流程 Struts2配置 struts2的加载顺序 P ...

  5. 10 | MySQL为什么有时候会选错索引?

    前面我们介绍过索引,你已经知道了在MySQL中一张表其实是可以支持多个索引的.但是,你写SQL语句的时候,并没有主动指定使用哪个索引.也就是说,使用哪个索引是由MySQL来确定的. 不知道你有没有碰到 ...

  6. Promtail Pipeline 日志处理配置

    转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247492144&idx=1&sn=a1cc13a642 ...

  7. 地区sql

    /*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...

  8. c++11 关于typelist的foreach

    建好一个typelist,其中都是类型信息而已,很重要的一个应用,循环迭代干些事情. 看了下boost的for_each实现,用我自己的typelist,大概代码如下: template<typ ...

  9. C++11 TypeList 妙用

    源码展示: #include <iostream> using namespace std; template <typename ... Args> struct typel ...

随机推荐

  1. Eclipse中user library包管理

    1.整理jar 2.将整理出的jar包在Eclipse中分别设置为用户librarywindow -> preferences -> java -> build path -> ...

  2. 汇编与C语言混合 实现的从小到大的冒泡排序

    汇编实现的从小到大的冒泡排序 主函数由C语言实现,sort函数用汇编语言写 #include <stdio.h>  int buffer[256];      //数据缓冲区  int   ...

  3. 蒙特罗卡π算法(C++语言描述)

    圆的面积计算公式为:S=π*r*r 将圆放到一个直角坐标系中,如图黄色部分的面积是S/4=(π*r*r)/4;如果我们将取一个单位圆,则S/4=π/4. 因为是单位圆,半径为1,所以图中红色正方形的面 ...

  4. Ubuntu 14.10下安装深度音乐客户端

    很多刚从windows系统投靠到ubuntu的机油,在听音乐时不是很舒心.毕竟ubuntu软件中心的很多影音软件都是国外的朋友编写的,所以很多时候国内的朋友用着很不舒服.今天给大家推荐的是国内开发者针 ...

  5. Solr相关概念详解:SolrRequestHandler

    转自:http://www.cnblogs.com/chenying99/archive/2012/07/24/2607339.html 1. standard (StandardRequestHan ...

  6. lightOJ 1366 Pair of Touching Circles(统计矩形内相切圆对)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1366 题意:给出一个矩形,在内部画两个圆A和B使得AB都完全在矩形内且AB相切且AB的 ...

  7. 如何扩展VCL的hint

    默认的Hint窗口展现如下: 这种情况下可以操作有窗口的背景颜色,字体样式 Application.Color 有的时候仅仅是文字满足不了我们的需求,比例如下格式: 这个时候就应该执行以下步骤: 1. ...

  8. 深入.NET框架 项目--魔兽登录系统

    创建魔兽系统相关窗体: 登录窗体(frmLogin) 注册窗体(frmRegister) 主窗体   (frmMain) 实现魔兽登录系统: 登录的界面如下 实现思路: 1.创建一个对象数组,长度为1 ...

  9. BZOJ3674: 可持久化并查集加强版

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3674 题解:主要是可持久化的思想.膜拜了一下hzwer的代码后懂了. 其实本质是可持久化fa数 ...

  10. 【转】Windows Server 2008 以上服务器配置SMTP

    建立 SMTP 伺服器 [除非特別說明,否則本主題中的內容適用於 BizTalk Server 2013 和 2013 R2.]原文链接:https://msdn.microsoft.com/zh-t ...