1
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 );

我不明白 fold 的工作方式,为什么是 int_<0>?为什么是_float< _2 >?

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

4

1 回答 1

3

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

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

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

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

如果谓词返回 false,我们只需返回 _1,即未更改状态。

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

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

于 2011-04-23T11:05:49.753 回答