瘦身前后——兼谈C 语言进化[3]
2008-02-23 05:41:05来源:互联网 阅读 ()
struct Op { int operator()(int a1, int a2) { return f(a1) f(a2); } }; transform(…, Op()); |
稍微好一点,但这种做法也有很严重的问题。
为什么Java加入closure,其实还是个语法问题。从严格意义上,Java的anonymous class已能够实现出相同的功能了,正如C 的functor相同。然而,代码是给人看的,语言是给人用来写代码的,代码的主要代价在维护,维护则需要阅读、理解。写代码的人不希望多花笔墨来写那些自己本不关心的东西,读代码的人也希望“所读即所表”,不想看到代码里面有什么弯子,最好是自然语言自然抽象才好呢。
所以,尽管closure是一颗语法糖,但却是一颗很甜很甜的糖,因为有了closure您就能够写:
transform(…, <>(a1, a2){ f(a1) f(a2) }); Simple things should be simple! |
此外,closure最强大的好处还是在于对局部变量的方便的引用,设想我们想要创建的表达式是:
int weight1 = 0.3, weight2 = 0.6; transform(…, f(_1)*weight1 f(_2)*weight2); |
当然,上面的语句是非法的,但是使用closure便能够写成:
int weight1 = 0.3, weight2 = 0.6; transform(…, <&>(_1, _2){ f(_1)*weight1 f(_2)*weight2 } ); |
用functor class来实现同样的功能则要麻烦许多,一旦麻烦,就会error-prone,一旦error-prone,就会消耗人力,而人力,就是金钱。
C 09也有希望加入lambda,但是这是另一个话题,下回再说。
The Real Deal——variadic templates
C 的callback类,google一下,没有一打也有半打。其中尤数boost.function实现得最为灵活周到。然而,就在其灵活周到的接口下面,却是让人不忍卒读的实现;03年的时候我写的第一篇boost源码剖析就是boost.function的,当时还觉得能看懂那样的代码牛得不行...话说回来,那篇文章主要剖析了两个方面,一个是他对不同参数的函数类型是如何处理的,第二个是个type-erase设施。其中第一个方面就占去了大部分的篇幅。
简而言之,要实现一个泛型的callback类,就必须实现以下最常见的应用场景:
function<int(int, int)> caller = f; int r = caller(1, 2); // call f |
为此function类模板里面肯定要有一个operator(),然而,接下来,如何定义这个operator()就成了问题:
template<Signature> class function { operator()(???); }; |
???处填什么?返回值处的???能够解决,用一个traits:typename result_type<Signature>::type,但参数列表处的???呢?
[1] [2] [3] [4] [5]
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 瘦身前后——兼谈C 语言进化[5]
下一篇: C
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash