需要解释boost :: mpl

时间:2011-04-23 10:14:07

标签: c++ boost boost-mpl

typedef vector<long,float,short,double,float,long,long double> types;
typedef fold<
      types
    , int_<0>
    , if_< is_float<_2>,next<_1>,_1 >
    >::type number_of_floats;

BOOST_MPL_ASSERT_RELATION( number_of_floats::value, ==, 4 );

我不明白折叠的方式,为什么int_&lt; 0&gt;?为什么is_float&lt; _2 &gt; ?

有人能给我一些线索来理解这个“功能”吗?感谢

1 个答案:

答案 0 :(得分:3)

int_<0>是用于折叠的累加器的起始值。尝试使用int_<1>,看看会发生什么。

第三个参数是用于折叠序列的运算符。这需要是二元元函数。 if_< is_float<_2>,next<_1>,_1 >变为带有两个参数的lambda表达式,其中_1和_2引用此lambda表达式所采用的第一个和第二个参数。

如果is_float<_2>的第二个参数是if_,谓词float将返回true。 _2是占位符。占位符是指模板特化的第n个参数。

下一个&LT; _1&GT;只返回当前状态的下一个值(例如next<int_<0>> == int_<1>)。

如果谓词返回false,我们只返回_1,这是未改变的状态。

尝试先了解折叠是什么,然后尝试理解boost :: mpl的做法。

一个简单的练习是编写一个返回向量长度的折叠。