如题。我总是后知后觉诶。不过这提案有意思……
之前我在[url=http://rednaxelafx.iteye.com/blog/177604]C#与Ruby 1.8在作用域与闭包上的比较[/url]的回复里还说C++没有闭包所以不知道它是什么东西也没关系,反正也用不了。这在当前的C++里是没错,不过未来版本的C++里我们也能用到闭包了。
按照C++98(或者叫ISO/IEC 14882 : 1998)的话,要定义一块代码然后把它传来传去的话,我们需要的是一个functor——能重载()运算符的C++的强大能力的一种体现。但是C++的语法不允许我们在一个表达式里定义一个类,所以要使用一个“只用一次”的functor时,我们还非得到函数外面去定义一个有名字的functor类型,很是麻烦。
Boost.Lambda应对就地定义一个在函数里就地定义匿名类型的functor的需求而做了个不错的实现。Boost库里也有binder在简单的情况下用起来还算方便。
Herb Sutter有篇介绍文: [url=http://herbsutter.spaces.live.com/blog/cns!2D4327CC297151BB!785.entry]Trip Report: February/March 2008 ISO C++ Standards Meeting[/url], 2008/3/29
看到C++0x那lambda表达式的闭包可以有选择性的捕获外部变量我就湿了啊……
不过话说回来,这闭包跟D 2.0在2.007版本之前的状况一样,是不完整意义上的闭包:一旦离开了定义那个lambda表达式的inner most block之后,再调用那个lambda表达式时以reference方式捕获到的变量会发生什么变化[i]未定义[/i]……
啊,到时间去找老师了。回来再写点什么。
之前我在[url=http://rednaxelafx.iteye.com/blog/177604]C#与Ruby 1.8在作用域与闭包上的比较[/url]的回复里还说C++没有闭包所以不知道它是什么东西也没关系,反正也用不了。这在当前的C++里是没错,不过未来版本的C++里我们也能用到闭包了。
按照C++98(或者叫ISO/IEC 14882 : 1998)的话,要定义一块代码然后把它传来传去的话,我们需要的是一个functor——能重载()运算符的C++的强大能力的一种体现。但是C++的语法不允许我们在一个表达式里定义一个类,所以要使用一个“只用一次”的functor时,我们还非得到函数外面去定义一个有名字的functor类型,很是麻烦。
Boost.Lambda应对就地定义一个在函数里就地定义匿名类型的functor的需求而做了个不错的实现。Boost库里也有binder在简单的情况下用起来还算方便。
Herb Sutter有篇介绍文: [url=http://herbsutter.spaces.live.com/blog/cns!2D4327CC297151BB!785.entry]Trip Report: February/March 2008 ISO C++ Standards Meeting[/url], 2008/3/29
看到C++0x那lambda表达式的闭包可以有选择性的捕获外部变量我就湿了啊……
不过话说回来,这闭包跟D 2.0在2.007版本之前的状况一样,是不完整意义上的闭包:一旦离开了定义那个lambda表达式的inner most block之后,再调用那个lambda表达式时以reference方式捕获到的变量会发生什么变化[i]未定义[/i]……
啊,到时间去找老师了。回来再写点什么。