源码展示:

#include <iostream>

using namespace std;

template <typename ... Args> struct typelist;

typedef typelist <int ,short ,double ,long ,float> defaultPolicys;

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 ,int I, typename K= defaultPolicys> struct replace; template <typename T, int I, typename H,typename ...Tail> struct replace<T,I,typelist<H,Tail...>>
{
typedef typename concat<H, typename replace<T, I-, typelist<Tail...>>::type>::type type;
}; template <typename T,typename H,typename... Tail> struct replace<T,,typelist<H,Tail...>>
{
typedef typelist<T,Tail...> type;
}; template <typename T ,int I> struct Custom
{
const static int index = I;
typedef T newType;
}; template <typename ...> struct CEO; template <> struct CEO<>
{
typedef defaultPolicys myPolicys;
}; template <typename T> struct CEO<T>
{
typedef typename replace<typename T::newType,T::index>::type myPolicys;
};
//template <typename T,typename U> struct CEO<T,U>{ typedef typename replace<typename U::newType,U::index,typename CEO<T>::myPolicys>::type myPolicy;}; template <typename T,typename ... Tail> struct CEO<T,Tail...>
{
typedef typename replace<typename T::newType,T::index,typename CEO<Tail...>::myPolicys>::type myPolicys;
}; int main()
{ typedef typelist <int ,short ,double ,long ,float> five;
typedef typelist <int ,short ,string, char ,string> fives;
if(is_same<typename CEO<>::myPolicys,five>::value)cout<<"..."<<endl;
if(is_same< CEO< Custom<string,>,Custom<char,>,Custom<string,> > ::myPolicys,fives>::value)cout<<"..."<<endl; return ; }
template <typename ... Args> struct typelist; typelist声明
template <typename A, typename B> struct concat; 连接任意类型至typelist头或尾部声明
template <typename... A, typename... B>
struct concat<typelist<A...>, typelist<B...> >
{
typedef typelist<A..., B...> type;
}; 连接两个typelist偏特化定义 template<typename T, typename... TList>
struct concat<typelist<TList...>, T >
{
    typedef typelist<TList..., T> type;
}; 将类型连接至typelist尾部偏定义 template<typename T, typename... TList>
struct concat< T, typelist<TList...> >
{
    typedef typelist<T, TList...>  type;
}; 将类型连接至typelist头部偏特化定义
template <typename T ,int I, typename K = defaultPolicys> struct replace; 用类型T替换K=typelist的I位置类型的声明
template <typename T, int I, typename H,typename ...Tail> struct replace<T,I,typelist<H,Tail...>>
{
typedef typename concat<H, typename replace<T, I-1, typelist<Tail...>>::type>::type type;
}; 偏特化定义,递归入口 template <typename T,typename H,typename... Tail> struct replace<T,0,typelist<H,Tail...>>
{
typedef typelist<T,Tail...> type;
}; 偏特化定义,递归出口

template <typename T ,int I> struct Custom
{
const static int index = I;
typedef T newType;
}; 用于自定义类型

template <typename ...> struct CEO; CEO:Policys的执行者

template <> struct CEO<>
{
typedef defaultPolicys myPolicys; CEO<>拥有默认的Policys
}; template <typename T> struct CEO<T>
{
typedef typename replace<typename T::newType,T::index>::type myPolicys;
}; 自定义单个Policy的偏特化定义
//template <typename T,typename U> struct CEO<T,U>{ typedef typename replace<typename U::newType,U::index,typename CEO<T>::myPolicys>::type myPolicy;}; template <typename T,typename ... Tail> struct CEO<T,Tail...>
{
typedef typename replace<typename T::newType,T::index,typename CEO<Tail...>::myPolicys>::type myPolicys;
}; 自定义多个Policys的偏特化定义
使用如下代码初步测试:
 CEO< Custom<string,2>,Custom<char,3>,Custom<string,4> > ::myPolicys
myPolicys 类型为 typelist<int ,short ,string ,char ,string>
----------------------------------------------------------------------------------------------------------------------------------------
这段代码有什么用?
假设在typelist中,每一个类型拥有一个静态的函数,若如此CEO<>拥有一套默认的函数。
CEO<Custom<xType,xIndex>> ,将替换掉某个默认的函数行为。
这听起来有点像模板方法模式,但我们使用是静多态,并没有使用继承和虚函数机制。
而且用户使用也相当容易,并且代码更容易扩展,如果需要更改默认的Policys,只需扩充默认typelist即可。 在《C++ Template》 一书中,继承与模板那一章的第一节,讲述的是如何使用多继承和模板完成上述功能,而在《C++ 设计新思维》中讲到了typelist技术,而如今C++14提供可变长模板参数。
结合此三项,初步实现上述代码。文章标题 言为妙用,实不敢当,有兴趣的同学,可以继续深入研究,在此抛砖引玉。 转载请表明出处,谢谢合作

C++11 TypeList 妙用的更多相关文章

  1. 地区sql

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

  2. 使用c++11改写loki的TypeList

    最近看了C++11的一些特性,最感兴趣的是可变模板参数,自动类型推断和匿名函数. Loki中的TypeList,是需要递归定义的,并且需要一个NullType作为尾节点. 可变模板参数使得实现Type ...

  3. 妙味课堂:JavaScript初级--第11课:字符串、查找高亮显示

    1.数字字母 Unicode 编码 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content- ...

  4. 妙味css3课程---1-1、css中自定义属性可以用属性选择器么

    妙味css3课程---1-1.css中自定义属性可以用属性选择器么 一.总结 一句话总结:可以的. 1.如何实现用属性选择器实现a标签根据href里面含有的字段选择背景图片? p a[href*=te ...

  5. c++11 关于typelist的foreach

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

  6. 泛化之美--C++11可变模版参数的妙用

    1概述 C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数.相比C++98/03 ...

  7. 泛化之美 —— C++11 可变参数模板的妙用

    概述 首先这篇文章出自博客园作者:[qicosmos ],我对本文的实例代码进行了学习.思考和整理纠正,理清了文章的全部细节,觉得这是一篇让我受益匪浅的文章.之所以会接触「可变参数模板」这部分的内容, ...

  8. X86逆向11:F12暂停法的妙用

    本节课将介绍F12暂停法的使用技巧,F12暂停法的原理其实很简单,当我们点击OD中的暂停按钮时,OD会将当前的堆栈状态保存起来,并暂停当前窗体的线程执行,直到我们点击运行按钮OD才会唤醒全部线程并继续 ...

  9. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

随机推荐

  1. SVN工具使用总结

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion ...

  2. 二十二、详述 IntelliJ IDEA 中恢复代码的方法

    在咱们正常开发项目的时候,难免遇到在开发过程中由于某种原因,想要将代码恢复到前一版本的情景.特别是在咱们删除了某些代码,想要恢复之前删除的代码的时候,了解这个在 IntelliJ IDEA 中恢复代码 ...

  3. 商业化IM 客户端设计---Message模型

    在IM开发中,一个问题是怎么管理传输,包括处理消息发送,消息接受和怎么转发等等,就是上一篇文章提到的IMService扮演的角色.另一个问题就是传输的具体数据是怎么定义的,既包括业务数据(文字,语音, ...

  4. Xcode打开playground运行很慢或者无法输出的解决办法

    学习Swift最快捷的方法就是创建playground,但有时后运行很慢或者一直显示Running,无法输出. 解决办法 关闭Xcode 在终端里执行2段代码 rm -rf ~/Library/Dev ...

  5. 我的前端工具集(六)Ajax封装token

    我的前端工具集(六)Ajax封装token   liuyuhang原创,未经允许禁止转载 在单点登陆中,或登陆验证后,不应该每次都验证用户名和密码, 也不应该将用户名密码存入cookie中(虽然很多都 ...

  6. 03JavaScript 输出

    JavaScript 输出 JavaScript 没有任何打印或者输出的函数. 先来一点DOM的小知识点: DOM 解释: 您会经常看到 document.getElementById("i ...

  7. pom.xml文件报MavenArchiver错误 org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration)

    第一种方式 war项目 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId> ...

  8. JS实现继承 JavaScript

    JS实现继承 JavaScript 定义一个父类: // 定义一个动物类 function Animal (name) { // 属性 this.name = name || 'Animal'; // ...

  9. vue2.0 移动端,下拉刷新,上拉加载更多插件,修改版

    在[实现丰盛]的插件基础修改[vue2.0 移动端,下拉刷新,上拉加载更多 插件], 1.修改加载到尾页面,返回顶部刷新数据,无法继续加重下一页 2.修改加载完成文字提示 原文链接:http://ww ...

  10. C# 发送Http协议 模拟 Post Get请求

    1.参数 paramsValue的格式 要和 Reques.ContentType一致, 如果 contentype  "application/x-www-form-urlencoded& ...