C++14尝鲜:在C++中实现LINQ

在C++中实现LINQ

#include <iostream>
#include <vector>

template<typename TIterator>
struct from_range
{
	typedef typename std::iterator_traits<TIterator>::value_type value_type;

	TIterator current, upcoming, end;
	from_range(TIterator begin, TIterator end)
		: current(begin), upcoming(begin), end(end) {}

	template<typename TRangeBuilder>
	decltype(auto) operator>>(TRangeBuilder builder) const { return builder.build(*this); }
	decltype(auto) front() const { return *current; }
	bool next() { return upcoming == end ? false : (current = upcoming++, true); }
};

template<typename TRange, typename TPredicate>
struct where_range
{
	typedef typename TRange::value_type value_type;

	TRange range;
	TPredicate predicate;
	where_range(TRange range, TPredicate predicate)
		: range(range), predicate(predicate) {}

	template<typename TRangeBuilder>
	decltype(auto) operator>>(TRangeBuilder builder) const { return builder.build(*this); }
	decltype(auto) front() const { return range.front(); }
	bool next()
	{
		while(range.next())
			if(predicate(range.front()))
				return true;
		return false;
	}
};

template<typename TPredicate>
struct where_builder
{
	TPredicate predicate;
	where_builder(TPredicate predicate) : predicate(predicate) {}
	template<typename TRange>
	auto build(TRange range){
		return where_range<TRange, TPredicate>(range, predicate);
	}
};

struct to_vector_builder
{
	template<typename TRange>
	auto build(TRange range){
		std::vector<TRange::value_type> result;
		while(range.next())
			result.push_back(range.front());
		return result;
	}
};

template<typename TContainer>
auto from(TContainer const& container)
{
	return from_range<decltype(std::begin(container))>(std::begin(container), std::end(container));
}
auto to_vector() { return to_vector_builder(); }
template<typename TPredicate>
auto where(TPredicate predicate) { return where_builder<TPredicate>(predicate); }

int main()
{
	int a[] = {1, 2, 3, 4};
	auto v = from(a) >> where([](int n){return n % 2 == 0;}) >> to_vector();
	for(int i : v) std::cout << i << std::endl;
}

/*
2
4
*/
时间: 2024-10-14 09:35:17

C++14尝鲜:在C++中实现LINQ的相关文章

C++14尝鲜:Generic Lambdas(泛型lambda)

所谓泛型lambda.就是在形參声明中使用auto类型指示说明符的lambda. 比方 auto lambda = [](auto x, auto y) {return x + y;}; 依据C++14标准,这一lambda与下面代码作用同样. struct unnamed_lambda { template<typename T, typename U> auto operator()(T x, U y) const {return x + y;} }; auto lambda = unna

【甘道夫】Hadoop2.4.1尝鲜部署+完整版配置文件

引言 转眼间,Hadoop的stable版本已经升级到2.4.1了,社区的力量真是强大!3.0啥时候release呢? 今天做了个调研,尝鲜了一下2.4.1版本的分布式部署,包括NN HA(目前已经部署好了2.2.0的NN HA,ZK和ZKFC用现成的),顺便也结合官方文档 http://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-common/ClusterSetup.html  梳理.补全了关键的配置文件属性,将同类属性归

屌丝就爱尝鲜头——java8再判断

这节,我们来通过具体的实例来看看Java8的具体用法. 首当其冲,就是lambda用法. 这里的案例,就是用lambda来实现runnable接口,我们知道以前用匿名内部类的方式来实现runnable接口,这种方法晦涩难懂,用lambda表达式实现以后,这样的代码清爽了不少.上两种对比的代码: public static void main(String[] args) { new Runnable() { public void run() { System.out.println("这是匿名

屌丝就爱尝鲜头——java8总结晒一晒

前两节讨论了那么多,这节就是两个议题,讨论了新增的日期的api,再说一说我的Java8的一些心得体会了. 首先,我们必须要搞清楚Java 8 为什么要增加新的日期的api,这是由于老的日期api非常的繁琐,使用起来非常不方便,Java作者奉行这变者通不变者死的原则,于是增加了这些api.下面,我们总点介绍这几个类--LocalDate类.LocalTime类.LocalDateTime类.DateTimeFormatter类,zoneDate类.一个个来看: Ⅰ.LocalDate类--返回日期

屌丝就爱尝鲜头——java8初体验

Java8已经推出,让我们看看他的魅力.让我们看看他改变较大的部分. 一.java8概述 Java8是由Oracle(甲骨文)公司与2014年3月27日正式推出的.Java8同时推出有3套语言系统,分别是Java SE8.Java SE Emebbled 8.Java ME8. Java SE8较以往的系统增强的功能有: ①增强了对集合式操作语言--lambda表达式的支持,"Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演

Cocos2d-x v3.0正式版尝鲜体验【3】 Label文本标签

Cocos2d-x在新版本中加入了新的Label API,和以往不同的是,2.x的版本是通过三个不同的类来创建不同的文本标签,而现在是模仿着精灵的创建方式,一个类创建不同形式的文本,不过核心内容还是差不多的. 这是新的Label类结构图 在2.x的系列中,有三种文本,分别是TTF,BMFont和Atlas.在3.0中,将TTF拆分成两种,下面就分别看一下这四种文本的创建. 1.Label::createWithTTF 这是需要使用ttf格式字体文件的创建方式 TTFConfig config("

微信小程序的原型设计尝鲜

"小程序"来了,大世界要变了?微信小程序可能是近期业绩最火的话题之一了. 这个根植于微信流量巨无霸的应用,将对应用市场.对微商.电商.对企业的开发成本.获客成本将产生深远影响?将制造出绕开Google Play和AppStore的另一大App体系?将实现"知人性"的PM张小龙先生的"用后即走"的轻量App之梦?将秒杀传统的App? 虽有海量追捧者趋之若鹜,但也有冷静人士淡定的白眼.但无论如何,腾讯这步棋子既然落在了棋盘上,绝不能悔棋,更不可能半途

15.EVE-NG小众镜像,助力尝鲜!

文章列表(关注微信公众号EmulatedLab,及时获取文章以及下载链接) 1.EVE-NG介绍(EVE-NG最好用的模拟器,仿真环境时代来临!) 2.EVE-NG安装过程介绍 3.EVE-NG导入Dynamips和IOL 4.EVE-NG导入QEMU镜像 5.EVE-NG关联SecureCRT,VNC,Wireshark 6.EVE-NG网卡桥接,带您走进更高级的实验 7.EVE-NG硬盘扩容,存储海量镜像 8.EVE-NG定制个人镜像,脚本快速导入 9.EVE-NG容纳H3C.Huawei,

CoreOS那些事之Rkt容器尝鲜(上)

从CoreOS发布Rocket应用容器项目到现在,已经过去半年时间了.为了增加辨识度,项目更名为了Rkt.在沉寂了许久后,最近又开始在社区里出现了一些新鲜的声音. 首先是4月7日的一条新闻,Google领头投资CoreOS公司1200万美元以共同合作发展旗下的Kubernetes组件.此次合作除了促成新的商业发行版Tectonic的诞生,也使得Rkt容器与Kubernetes的关系拉近了一步:Kubernetes将提供对Rkt的友好支持,而Rkt则将沿用Kubernetes的Pods等概念来规划