c++11 关于typelist的foreach
建好一个typelist,其中都是类型信息而已,很重要的一个应用,循环迭代干些事情。
看了下boost的for_each实现,用我自己的typelist,大概代码如下:
template<typename TList, typename F>
void foreach_f(const F& f, TList* s = )
{
typedef typename front<TList>::type head_type;
typedef typename pop_front<TList>::type tail_type;
head_type head_arg;
f(head_arg);
foreach_f(f, static_cast<tail_type*>());
} template<typename F>
void foreach_f(const F&, nulllist* s = )
{ }
例子:
struct print_t
{
template<typename T>
void operator() (T& t) const
{
std::cout << typeid(T).name() << std::endl;
}
}; int main()
{
typedef typelist<int, float, bool> statelist;
foreach_f<statelist>(print_t());
}
我不喜欢的是实现中,要初始化一个参数类型,即:
head_type head_arg;
f(head_arg);
这不如直接迭代一个tuple。
免去这步初始化,也可以这么做,虽然也不怎么喜欢:
template<template<class> class F, typename... TList> struct foreach_t; template<template<class> class F, typename... TList>
struct foreach_t<F, typelist<TList...>>
{
typedef typelist<TList...> type_list;
typedef typename front<type_list>::type head_type;
typedef typename pop_front<type_list>::type tail_type; static void apply()
{
F<head_type> f;
f();
return foreach_t<F, tail_type>::apply();
}
}; template<template<class> class F>
struct foreach_t<F, nulllist>
{
static void apply() {}
};
使用一个模板类作为functor。
F<head_type> f;
f();
仍是不得不构造一个实例出来。而且比较难于保存信息。因为F<head_type>()是个临时变量。
不过这里很好玩的一个地方,这是一个类似函数语言的无边界效果的调用.没有副作用,却也没能发挥多少作用.
c++11 关于typelist的foreach的更多相关文章
- 使用c++11改写loki的TypeList
最近看了C++11的一些特性,最感兴趣的是可变模板参数,自动类型推断和匿名函数. Loki中的TypeList,是需要递归定义的,并且需要一个NullType作为尾节点. 可变模板参数使得实现Type ...
- PHP foreach &$ 引发的bug
在使用foreach &$来更新数据的时候,造成数据被更新掉了 $arr = array(1,2,3,4,5); foreach ($arr as &$row) { $row += 1 ...
- JS中map与forEach的区别
很多同学可能对于map与forEach的区别不是太了解,今天我们介绍一下JS中的map与forEach方法, 我对map的理解是,这个方法对一个数组arr1中的每一个元素进行遍历(传递给一个数组,参数 ...
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示
Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...
- Effective C#中文版
我看的书是<Effective C#中文版——改善C#程序的50种方法>,Bill Wagner著,李建忠译.书比较老了,04年写的,主要针对C#1.0,但我相信其中的观点现在仍有价值.( ...
- javascript Array Methods(学习笔记)
ECMAScript 5 定义了9个新的数组方法,分别为: 1.forEach(); 2.map(); 3.filter(); 4.every(); 5.some(); 6.reduce() ...
- javaweb学习总结(二十七)——jsp简单标签开发案例和打包
一.开发标签库 1.1.开发防盗链标签 1.编写标签处理器类:RefererTag.java 1 package me.gacl.web.simpletag; 2 3 import java.io.I ...
- [知识库分享系列] 二、.NET(ASP.NET)
最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...
- 自定义能够for each的类,C#,Java,C++,C++/cli的实现方法
自定义类能够被for each,应该算是个老生常谈的话题了,相关的资料都很多,不过这里整理总结主流语言的不同实现方式,并比较部分细节上的差异. 第一种语言,也是实现起来最简单的Java语言.在Java ...
随机推荐
- English trip 自习内容 句子结构和成分
句子是由词按照一定的语法结构组成的.组成句子的各个部分叫做句子的成分,包括:主语(subject).谓语(predicate).宾语(accusative).定语.状语.补足语.表语
- mongodump and mongorestore
mongoexport和mongoimport只能导出/导入某个特定集合 1 mongoexport bin目录下 ./mongoexport <hostname><:port> ...
- js 里面的那些节省字节的写法 a|0 void 0等等
//取整 parseInt(a,10); Math.floor(a); ~~a; //节省之后的写法 a|0; //节省之后的写法 //四舍五入 Math.round(a); a+.5|0; //节省 ...
- Configure the Stanford segmenter for NLTK
>>> from nltk.tokenize.stanford_segmenter import StanfordSegmenter >>> segmenter = ...
- vue-常用指令
一.一些指令 1.v-bind 绑定元素(简写 :) <div id="app-2"> <span v-bind:title="message" ...
- ILMerge合并多个DLL (转)
最近在研究CodeDom,用到ILMerge 序言 如果你的项目要提供多个dll给别人用,那么不妨让你的dll合并为一个,让别人看起来简洁,引用起来不会过于繁琐. 本篇比较少,但也算是比较实用吧. 下 ...
- vsCode---中文化
一直使用的是webStorm这个工具,不过由于这个工具不是那么的方便:比如我平时只是想新建一个html页面来编写一些js代码,以便测试自己的想法. 但是webStorm这个工具需要新建项目然后npm运 ...
- Windows IIS服务挂载NAS共享文件存储
本文介绍如何结合阿里云NAS的SMB协议支持和ECS Windows虚拟机,使用Windows内置的互联网信息服务(IIS)来提供Web和FTP服务. 阿里云文件存储服务NAS主要面向阿里云ECS 实 ...
- Convert Binary Search Tree to Doubly Linked List
Convert a binary search tree to doubly linked list with in-order traversal. Example Given a binary s ...
- 组队项目,Main队伍
本小组经过讨论,决定做的项目为----厨娘 分组情况: 1.界面设计:胡骏 2.前段,界面代码实现:梅庆 3.后台.逻辑处理:唐正奎.张军洪.袁成杰 4.数据库的建立与存写:张军洪.蒋利平 厨娘——需 ...