它是用遞歸實現的。首先看下面的句子:
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
崇文 閱讀(346)
評論(0) 編輯 收藏 引用