使用c++11改写loki的TypeList
最近看了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的更多相关文章
- 2018-2019-2-20175303 实验二 《Java开发环境的熟悉》实验报告
2018-2019-2-20175303 实验二 <Java开发环境的熟悉>实验报告 姓名:柴轩达 学号:20175303 班级:1753 实验课程:JAV ...
- Struts2 (上)
Struts2简介 Struts2框架的作用 Struts2是一个基于MVC设计模式的Web应用框架 它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controlle ...
- MySQL实战45讲学习笔记:第十讲
一 .本节内容概要 前面我们介绍过索引,你已经知道了在 MySQL 中一张表其实是可以支持多个索引的.但是,你写 SQL 语句的时候,并没有主动指定使用哪个索引.也就是说,使用哪个索引是由MySQL ...
- 三大框架 之 Struts2
目录 Struts2 Struts2简介 Struts2框架的作用 常见web层的框架 web框架特点 Struts2基本使用 Struts2执行流程 Struts2配置 struts2的加载顺序 P ...
- 10 | MySQL为什么有时候会选错索引?
前面我们介绍过索引,你已经知道了在MySQL中一张表其实是可以支持多个索引的.但是,你写SQL语句的时候,并没有主动指定使用哪个索引.也就是说,使用哪个索引是由MySQL来确定的. 不知道你有没有碰到 ...
- Promtail Pipeline 日志处理配置
转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247492144&idx=1&sn=a1cc13a642 ...
- 地区sql
/*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...
- c++11 关于typelist的foreach
建好一个typelist,其中都是类型信息而已,很重要的一个应用,循环迭代干些事情. 看了下boost的for_each实现,用我自己的typelist,大概代码如下: template<typ ...
- C++11 TypeList 妙用
源码展示: #include <iostream> using namespace std; template <typename ... Args> struct typel ...
随机推荐
- Deeplearning原文作者Hinton代码注解
[z]Deeplearning原文作者Hinton代码注解 跑Hinton最初代码时看到这篇注释文章,很少细心,待研究... 原文地址:>http://www.cnblogs.com/BeDPS ...
- dojo 四 类的构造函数和父方法的调用
与java类一样,在Dojo里也可以定义constructor 构造函数,在创建一个实例时可以对需要的属性进行初始化.//定义一个类Mqsy_yj var Mqsy_YJ = declare(null ...
- (五)ASP.NET中动态生成控件
今天被问到如何在ASP.NET 页面中动态创建一批控件,并且希望在后续代码中能访问到这些动态创建的控件.我用下面的例子来解释这个问题 ================================= ...
- Android端通过HttpURLConnection上传文件到服务器
Android端通过HttpURLConnection上传文件到服务器 一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HT ...
- 【HDOJ】3901 Wildcard
1. 题目描述有两个长度为$10^5$的字符串,其中一个仅包含小写字母,称之为源串:另一个包含?与*通配符的模式串,并且通配符的个数不超过10.求模式串是否能匹配源串? 2. 基本思路这其实是一道Re ...
- java中final关键字
一.final修饰方法 禁止任何继承类修改它的定义,保证在继承中使方法行为保持不闲并且不会被覆盖. final修饰的方法,同意编译器针对该方法的调用转为内嵌调用.(类似c++ 中的inline?) p ...
- Python3 学习第六弹: 迭代器与生成器
1> 迭代器 迭代的意思类似递归一般,不断地对一个对象做重复的操作.来看个例子: class Fibs: def __init__(self): self.last = self.now = 1 ...
- ORG 07C00H的意思
简单说来,该指令用来修正该指令以后出现的(变量/标志的)内存地址,也就是说如果有ORG 0x12345h,那么在该指令以后的变量的地址将被修正为0x12345+old_addr.对于DOS中的COM文 ...
- xcode快捷键的使用
1.统计Xcode项目代码行数 1 打开终端. 2 用ls和cd进到你项目的路径. 3 输入下面的指令: grep -r "\n" classes | wc -l (cl ...
- BZOJ 1415 聪聪和可可
f[i][j]表示i点追j点的期望步数... 这题必须spfa不能bfs. 且复杂度不会炸(仅1000条边) #include<iostream> #include<cstdio&g ...