易截截图软件、单文件、免安装、纯绿色、仅160KB

C++0x尝鲜 用lambda表达式模拟Ruby的过程对象

关于C++0x
预计于明年底推出的新标准C++0x,虽说已接近收官阶段,却仍有若干有待接纳的新提案被提出。尤其值得关注的是,与lambda表达式以及局部函数相关的提案“Unified Function Syntax(统一的函数语法)”,尽管不受标准委员会待见(两年间历经四次延迟表决,两次不予通过),仍然“顽强地”推出了其第7个版本N2989,提案作者锲而不舍的精神实在令人钦佩。
 
关于lambda表达式
受函数型编程风格的影响,一些OOP为主题思想的静态语言纷纷推出了lambda这一以短小的匿名函数为特点的语言设施,典型的如微软的VB9和C#3.0。与此相对应的是,众多动态脚本语言(python, ruby, javascript)则早就具备了相应的语言特性,Ruby的过程对象便是其中一例。这一次借C++0x新标准的东风,C++语言不甘人后同样引入了这一激动人心的新特性,为函数型编程风格在C++语言内的进一步推广打下了坚实的基础。
 
以下用C++0x中的lambda表达式来模拟Ruby的过程对象。
 
Ruby代码
class Array
def inject(n)
each { |value| n = yield(n, value) }
n
end
def sum
inject(0) { |n, value| n + value }
end
def product
inject(1) { |n, value| n * value }
end
def find
for i in 0...size
value = self[i]
return value if yield(value)
end
return nil
end
end
[ 1, 2, 3, 4, 5 ].sum # 15
[ 1, 2, 3, 4, 5 ].product # 120
[ 1, 2, 3, 4, 5 ].find {|v| v*v > 10 } # 4

有关Ruby的过程对象以及这段Ruby代码的说明,请参考Ruby语言中的泛回调及其在C++语言中的模拟实现一文。
 
C++代码
#include <array>
#include <functional>
//#include <numeric>
#include <algorithm>
#include <boost/assign.hpp>
#include <iostream>
using namespace std;
template<typename T>
struct Array : public vector<T>
{
template<typename _Iter>
Array(_Iter _First, _Iter _Last) : vector(_First, _Last) {}
T inject(T n, function<T(T,T)> f) const {
for_each(begin(), end(), [&](T value){n = f(n, value);});
return n;


相关文档:

【C\C++语言入门篇】 深入指针

再上一篇,我们介绍了基本调试。之前也说了,之所以把调试放在前面讲是因为后面的文章基本都会用到调试。观察我们的程序到底发生了什么。让我们能够直接明了的看清楚问题的本质。本篇将深入一点介绍指针这个让无数初学者畏惧的东西。希望大家再看完本篇之后能对指针有新的认识,之后不再惧怕它。觉得它就那么回事。那下面我 ......

zz C/C++中的日期和时间


C/C++中的日期和时间
摘要:
本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。
关键字:UTC(世界标准时间),Calendar Time( ......

经典C/C++面试题(三)

1) 什么是预编译,何时需要预编译:总是使用不经常改动的大型代码体。
程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。
2) char * const p;
  char const * p
  const char *p ......

经典C/C++面试题(三)2

32)
  int main()
  {
   int x=3;
   printf("%d",x);
   return 1;
  }
  问函数既然不会被其它函数调用,为什么要返回1?
  mian中,c标准认为0表示成功,非0表示错误。具体的值是某中具体出错信息
33) 要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号