程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++14嘗鮮:在C++中實現LINQ

C++14嘗鮮:在C++中實現LINQ

編輯:關於C++

在C++中實現LINQ

 

#include 
#include 

template
struct from_range
{
	typedef typename std::iterator_traits::value_type value_type;

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

	template
	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
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
	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
struct where_builder
{
	TPredicate predicate;
	where_builder(TPredicate predicate) : predicate(predicate) {}
	template
	auto build(TRange range){
		return where_range(range, predicate);
	}
};

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

template
auto from(TContainer const& container)
{
	return from_range(std::begin(container), std::end(container));
}
auto to_vector() { return to_vector_builder(); }
template
auto where(TPredicate predicate) { return where_builder(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
*/


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved