码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-04 22:09:16      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

在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
*/


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

标签:

原文地址:http://blog.csdn.net/zwvista/article/details/45486257

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!