// ConsoleApplication32.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
using namespace std;
#include <vector>
#include <iterator>
#include <iostream>
template<typename TIterator>
struct from_range
{
// range接口的成员类型
// 其含义为C++容器所包含数据的值类型
using value_type = typename std::iterator_traits<TIterator>::value_type; // from_range内含三个指向数据的迭代器
// 当前迭代器,其次迭代器,末尾迭代器
TIterator current, upcoming, end;
// from_range的构造器
// 当前迭代器指向容器的开头
// 其次迭代器指向容器的开头
// 末尾迭代器指向容器的末尾
from_range(TIterator begin, TIterator end)
: current(begin), upcoming(begin), end(end) {} // range接口的成员方法
// 重载>>操作符,该操作符接收一个build对象作为右操作符
// 该操作符将自身传给builder对象的build方法,通过调用该方法实现对range的转换
template<typename TRangeBuilder>
decltype(auto) operator >> (TRangeBuilder builder) const { return builder.build(*this); }
// front方法,返回当前迭代器所指向的数据,即当前数据
decltype(auto) front() const { return *current; }
// next方法,当前数据不存在则返回false,若存在则准备当前数据并返回true
// 具体实现为
// 1. 若其次迭代器与末尾迭代器的值相等,则其次迭代器已经指向容器末尾
// 判断当前数据不存在,返回false
// 2. 若其次迭代器与末尾迭代器的值不等,则其次迭代器尚未指向容器末尾
// 将其次迭代器的值赋予当前迭代器,递增其次迭代器,令其指向下一个数据
// 判断当前数据存在,返回true
bool next() { return upcoming == end ? false : (current = upcoming++, true); }
}; template<typename TRange, typename TPredicate>
struct where_range
{
// range接口的成员类型
// 其含义为转换源range所包含数据的值类型
using value_type = typename TRange::value_type; // where_range内含两个数据成员
// 转换源range,谓词(过滤条件)
TRange range;
TPredicate predicate;
// where_range的构造器
where_range(TRange range, TPredicate predicate)
: range(range), predicate(predicate) {} // range接口的成员方法
// 重载>>操作符,该操作符接收一个build对象作为右操作符
// 该操作符将自身传给builder对象的build方法,通过调用该方法实现对range的转换
template<typename TRangeBuilder>
decltype(auto) operator >> (TRangeBuilder builder) const { return builder.build(*this); }
// front方法,返回转换源range的当前数据
decltype(auto) front() const { return range.front(); }
// next方法,当前数据不存在则返回false,若存在则准备当前数据并返回true
// 具体实现为
// 扫描数据源range直至找到符合过滤条件的下一个数据
// 若该数据存在,则当前数据存在,返回true
// 否则当前数据不存在,返回false
bool next() {
while (range.next())
if (predicate(range.front()))
return true;
return false;
}
}; template<typename TPredicate>
struct where_builder
{
// where_builder只包含一个成员:谓词(过滤条件)
TPredicate predicate;
// where_builder的构造器
where_builder(TPredicate predicate) : predicate(predicate) {} // builder接口的成员方法
// build方法,生成并返回where_range对象
template<typename TRange>
auto build(TRange range) {
return where_range<TRange, TPredicate>(range, predicate);
}
}; struct to_vector_builder
{
// builder接口的成员方法
// build方法,生成并返回C++容器
// 具体实现为
// 扫描数据源range
// 将扫描所得到的数据依次插入到C++容器中
template<typename TRange>
auto build(TRange range) {
std::vector<TRange::value_type> result;
while (range.next())
result.push_back(range.front());
return result;
}
}; // LINQ操作符from,将C++容器转换成from_range对象
template<typename TContainer>
auto from(TContainer const& container)
{
return from_range<decltype(std::begin(container))>(std::begin(container), std::end(container));
}
// LINQ操作符where,生成并返回where_builder对象
template<typename TPredicate>
auto where(TPredicate predicate) { return where_builder<TPredicate>(predicate); }
// LINQ操作符to_vector,生成并返回to_vector_builder对象
auto to_vector() { return to_vector_builder(); } class Person
{
public: Person()
{ }
Person(int k)
{
this->k = k;
}
~Person()
{ }
public:
int k;
public:
static int m;
private:
int k1; protected:
int k2;
}; class HeiPerson :virtual public Person
{
public:
HeiPerson():Person()
{ }
};
class HuangPerson :virtual public Person
{
public:
HuangPerson() :Person()
{ }
}; class waiPerson :public HeiPerson,public HuangPerson
{
public:
waiPerson():Person()
{
// cout << HeiPerson::k;
} };
int Person::m = ; int main()
{
HeiPerson h;
waiPerson w;
vector<int> ivec;
ivec.push_back();
ivec.push_back();
ivec.push_back();
ivec.push_back(); vector<int>::iterator int_ite; for (int_ite = ivec.begin(); int_ite != ivec.end(); int_ite++)
cout << "ivec: " << *int_ite << endl;
/*cout << w.HeiPerson::k <<"3"<< endl;*/
//cout << "w.k=" <<w.k <<"w.m"<<w.Person::m<< endl;
//cout << w.m; int a[] = { , , , };
// 找出数组a中所有的偶数,将结果存放到一个vector对象中
auto v = from(a) >> where([](int n) {return n % == ; }) >> to_vector();
for (int i : v) std::cout << i << std::endl; system("pause");
return ;
}

c++模板实现 linq的更多相关文章

  1. silverlight的第一个程序

    摘要:silverlight是微软公司全力打造的一种跨平台.跨浏览器的RIA新技术,silverlight以XAML为界面呈现语言,支持2D矢量图形.动画.数据绑定.控件风格与模板.LINQ.WCF. ...

  2. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  3. JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

  4. 从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)

    原本关于T4模板原想分5个章节详细解说的,不过因为最近比较忙,也不想将整个系列时间拉得太长,所以就将它们整合在一块了,可能会有很多细节没有讲到,希望大家自己对着代码与模板去研究. 本章代码量会比较大, ...

  5. 从零开始编写自己的C#框架(13)——T4模板在逻辑层中的应用(二)

    最近这段时间特忙,公事私事,忙得有时都没时间打开电脑了,这两周只能尽量更新,以后再将章节补回来. 直接进入主题,通过上一章节,大家明白了怎么使用模板类编写T4模板,本章进的是一些简单技巧的应用 1.首 ...

  6. JavaScript学习总结(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

  7. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面

    前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...

  8. C#之发送邮件【模板】+【封装】ZJ版

    PS: 为了弥补上篇博客的不足,正好周六闲着没事.所以进行优化下,来个终结版 功能实现:模板发送+自指定邮箱发送+解耦 总体预览如下: 各代码如下:(代码略多,所以都折叠了) 前台; @{ Layou ...

  9. [MVC4]ASP.NET MVC4+EF5(Lambda/Linq)读取数据

    继续上一节初始ASP.NET MVC4,继续深入学习,感受了一下微软的MVC4+EF5(EntityFramework5)框架的强大,能够高效的开发出网站应用开发系统,下面就看一下如何用MVC4+EF ...

随机推荐

  1. 剑指offer-第六章面试中的各项能力(不用加减乘除做加法)

    //不用加减乘除四则运算,来做加法 //题目:两个数做加法. //思路:用二进制的位运算的思路.第一步:首先两数相加考虑进位.可以用异或. //第二步:两个数相加只考虑进位,并将最后的结果左移.第三步 ...

  2. git撤销各种状态下的操作

    使用Git时会出现各种各样的问题,下面是几种情况下怎么反悔的操作 一,未加入缓存区,撤销文件修改 git checkout -- file 二,已加入缓存区,撤销文件提交 git reset HEAD ...

  3. PCANet

    从上图可以看到,PCANet的训练分为三个步骤(stage),前两个stage很相似,都是去平均,然后PCA取主成分并卷积,最后一步是二值化(为了产生非线性输出)和直方图量化. 设滤波器个数为f, 1 ...

  4. MDK中STM32使用Printf函数详细解析【转载】

    在用MDK调试STM32板子串口时,为了方便串口调试,调用了printf()函数,用Keil仿真是,串口不能正确的输出,软件仿真时,总是卡在那 里.有点纳闷,然后调用USART_SendData()函 ...

  5. Nginx httpS server配置

    Nginx httpS 配置 配置同时支持http和httpS协议: server { listen ; #backlog:每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包 ...

  6. Pycharm安装工具包

    1.在settings->Project Interpreter->configure interpreters->Install中可以找到所有的模块. PyCharm IDE会帮助 ...

  7. .com .cn .org .edu等域名的意义

    在开发的时候遇到了.org的域名,后来就去查了一下,原来这种域名是非盈利组织或者协会的标志 比如: https://getcomposer.org/ https://packagist.org/ ht ...

  8. 如何查看自己的laravel版本

    方法1: 使用php artisan --version ,只要能看懂这个命令的人一定已经具有初步的Laravel知识.再介绍一种不需要命令,直接去文件中去查看的方法. 方法2: 在项目文件中找ven ...

  9. MySQL for Linux错误: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    参考链接:http://www.cnblogs.com/gumuzi/p/5711495.html

  10. 编译openwrt失败 “Please install theopenssl library”

    make menuconfig出现了错误 Build dependency: Please install theopenssl library(with development headers) P ...