它是用递归实现的。首先看下面的句子:
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) 编辑 收藏 引用