需要对boost::mpl进行解释

need explanation on boost::mpl

本文关键字:解释 mpl boost      更新时间:2023-10-16
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_<0>?为什么is_float<<strong>_2> ?

有人能给我一些线索来理解这个"函数"吗?由于

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

第三个实参是用于折叠序列的操作符。这需要是一个二元元函数。if_< is_float<_2>,next<_1>,_1 >被转换成一个有两个参数的lambda表达式,其中_1和_2分别指该lambda表达式接受的第一个和第二个参数。

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

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

如果谓词返回false,则返回未改变状态的_1。

先试着理解折叠是什么,然后再试着理解boost::mpl的操作方法。

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