注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

为着理想勇敢前进

 
 
 

日志

 
 

1.34.0新特性之Boost.Typeof (1)背景简述  

2007-04-11 09:15:58|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
其实1.34.0增加的新库并不多,最有价值的可能还是两个小库,昨天说的Boost.Foreach和今天的Boost.Typeof,估计1.35.0会加入Boost.Asio,那才是重头戏。估计发布1.34.0的最大用处在于重新整理过了TR1(TR1是C++ 0X标准第一次某某某会议讨论可能要加入标准库的会议纪要)的库。

这个Boost.Typeof主要作用是根据表达式来推算类型。其中一个宏BOOST_AUTO的用法如下:

BOOST_AUTO(x, 1);

这个代码等价于int x = 1; 他的功能就是声明一个自动推算出类型的x来。C++0X增加一个auto关键字以后就不需要BOOST_AUTO了,而直接用auto x = 1;就可以了。

按道理说,C++的类型本来是不用推算的,C++都是强类型,一个变量应该是什么类型都应该明确声明,需要什么类型可以根据需要调用的函数定义来知道。

另一方面,脚本语言的变量声明没有类型,一个变量的类型是由其内容决定的,比如JavaScript的var x = 1; VB6的Dim x = 1也是类似的,VB6声明一个没有类型的变量其实是一个Variant类型的变量,Variant的变量本身就包括了类型信息,但是这几种类型信息只是几种原始类型,如int,bool啥的,在Variant上调用成员函数靠的是IDispatch,这也是运行时的东西,通过方法的名字查找出dispid,然后再以这个dispid来调,IDispatch的实现大多用的哈希表来做到以方法名字来方法。

C++里面不会有这种运行时的特性,C++标准委员会的那一帮偏执狂绝对不会允许任何可能降低效率的特性的……所以BOOST_AUTO其实是一个编译时的推算,在运行的时候,那个x就是一个已经确定的int。

BOOST_AUTO(x, 1);也可以写成BOOST_TYPEOF(1) x = 1; 其含义一目了然。

这种推算类型的语法最大的作用大概是用于一些足够复杂的类型。比如Boost.Lambda中的functor,如果不用BOOST_AUTO,可能会有这样的代码:

lambda_functor<
lambda_functor_base<
logical_action<and_action>,
tuple<
lambda_functor<
lambda_functor_base<
relational_action<greater_action>,
tuple<
lambda_functor<placeholder<1> >,
int const
>
>
>,
lambda_functor<
lambda_functor_base<
relational_action<less_action>,
tuple<
lambda_functor<placeholder<2> >,
int const
>
>
>
>
>
>
f = _1 > 15 && _2 < 20;

Boost.Lambda实际上是把匿名函数内部的代码记录在模板参数关系中了。类似的,Boost.Spirit也把EBNF语法记录在了模板里面。Boost.Spirit和Boost.Lambda其类型本身就代表了表达式。这时候,上面冗长的代码能写成BOOST_AUTO(f, _1 > 15 && _2 < 20);的价值不言而喻。

明天接着谈Boost.Typeof的实现。

  评论这张
 
阅读(410)| 评论(4)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018