2008/3/29 原文:
ISO C++委员会于2008年2月24日到3月1日 在Bellevue, WA举行大会。在这里我将为会议的内容做简要阐述(附上相关链接以供作更进一步的参考),并为大家预报接下来的会议内容。
Lambda函数和Closure特性
对于我来说,这次会议的头条新闻是我们投票通过将lambda函数和closure特性引入到C++0x中,这会使STL算法的可用性得到数量级的提高,并且对于同步执行的代码来说这也是一大福音,因为它可以使程序员在程序中任何看起来合适的位置(例如:在一个工作线程上)使用函数。更为重要的是,它的使用非常便捷,可以绕过类似于对象代码片段。
C++总是通过函数对象来支持这一特性,使得lambda函数和closure特性不过是让编写函数的语法变得简单。但是,尽管是“不过是“简单,有很多理由可以证明这种简单的威力是难以置信的,其中就包含程序员可以在任何需要的地方编写函数而不是在离这里很远的其它地方。
例子:一段控制台程序中的collection代码
例如,假如你打算在控制台程序中为Widgett对象的集合写each:
// Writing a collection to cout, in today's C++, option 1:
for(vector:: iterator i = w.begin(); i != w.end(); ++i)
cout << *i << " ";
或者我们可以换一种更为强大的方式,C++已经拥有了一种特殊的ostream_iterator类型来为我们实现:
// Writing a collection to cout, in today's C++, option 2:
copy(w.begin(), w.end(), ostream_iterator(cout , " "));
在C++0x中,只需要用lambda,在运行中编写一个正确的函数对象:
// Writing a collection to cout, in C++0x:
for_each(w.begin(), w.end(), [](const Widget& w){ cout << w << " "; } );
(可用性小记:当我把这些例子拿到编译器中去检查时,这个lambda版本是我唯一一个一写就正确的代码。“Nuff 说。<搞笑 type=”不要脸“>是的,那意味着我在(C++0x)编译器上试过。不不不,我不是在为VC++ 10做任何产品申明。至少现在不是<搞笑>
例子:查找Weight() > 100的元素
另外一个例子,假如你希望在一个集合中查找weight > 100的元素。
你可能会这样写代码了:
//Calling find_if using a functor, in today's C++
//outside the function, at namespace scope
class GreaterThan{
int weight;
public:
GreaterThan(int weight_) : wight(weight_){}
bool operator() (const Weight& w) {
return w.Weight() > weight;
}
};
//at point of use
find_if(w.begin(), w.end(), GreaterThan(100));
写到这里,肯定会有人指出a)我们有像bind2nd一样的C++98标准的binder帮助类;b)我们有Boost社区的bind和lambda类库。他们这这里并不能起到什么作用,至少,如果你不想让你的代码具有可读性和可维护性的话。如果你不信,那么走着瞧吧。
在C++0x中,你可以就这样写:
//Calling find_if using a lambda, in C++0x:
find_if(w.begin(), w.end(), [](Widget& w){return w.Weight() > 100;]);
哈,好多了吧。
大多数关于loop的例子....
事实上,每个类似于loop的算法都在被当作loop使用。下面是我临时写的使用std::for_each和std::transform的例子:
for_each(v.begin(),v.end(),
[](Widget& w)
{
....
.... use or modify w ...
....
});
transform(v.begin(), v.end(), output.begin(),
[](Widget& w)
{
....
return SomeResultCalculatedFrom(w);
});
嗯,谁知道:随着C++0x lambdas 函数开始在未来的编译器中得到支持,我们应该开始习惯在loop结束时看到"});"了。
并行处理难题