随笔-14  评论-8  文章-0  trackbacks-0

      它是用递归实现的。首先看下面的句子:

mpl::and_<exp1, exp2>
    它使用的是头文件中的模板:
mpl::and_<exp1, exp2, true_, true_, true_>
           1_    2_     3_    4_      5_
    然后这个模板继承自:
aux::and_impl<
              BOOST_MPL_AUX_NESTED_TYPE_WKND(exp1)::value,
              exp2, 3_, 4_, 5_
             >
    若 1_ 的 value 为 false ,它就终结于下面的主模板:
template< bool C_, typename T1, typename T2, typename T3, typename T4 >
struct and_impl
    : false_ {};
    否则,继续前进:
aux::and_impl<
              BOOST_MPL_AUX_NESTED_TYPE_WKND(exp2)::value,
              3_, 4_, 5_, true_
             >
    这又回到了上一步的分叉路口。多个参数的情况与此类似。当全部参数都成 ture/true_ 时,就有了这个特化版本:
template<>
struct and_impl<
          true
        , true_, true_, true_, true_
        >
    : true_ {};
    这样一来,当前一个参数为 false 时,后面的参数就不用触及 ::value ,也就不会被实例化,这就是 short-circuit behavior,类似于 ||, && 等操作符。 
    同理可推知 or_ 的行为。
posted on 2009-12-08 11:36 崇文 阅读(333) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理