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