нужно объяснение на boost :: mpl - PullRequest
1 голос
/ 23 апреля 2011
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 >?

Может ли кто-нибудь дать мне несколько подсказок, чтобы понять эту «функцию»? спасибо

1 Ответ

3 голосов
/ 23 апреля 2011

int_<0> - начальное значение аккумулятора, используемого для сгиба.Попробуйте использовать int_<1> и посмотрите, что произойдет.

Третий аргумент - оператор, используемый для сворачивания последовательности.Это должна быть двоичная метафункция.if_< is_float<_2>,next<_1>,_1 > превращается в лямбда-выражение с двумя аргументами, где _1 и _2 ссылаются на первый и второй аргумент, который принимает это лямбда-выражение.

Предикат is_float<_2> возвращает true, если второй аргумент if_float._2 является заполнителем.Заполнители ссылаются на n-й аргумент специализации шаблона.

next <_1> просто возвращает следующее значение текущего состояния (например, next<int_<0>> == int_<1>).

Если предикат возвращает falseмы просто возвращаем _1, что является неизмененным состоянием.

Попытайтесь понять, что такое сгиб в первую очередь, а затем попытайтесь понять, как это сделать в boost :: mpl.

Простое упражнение состоит в том, чтобынаписать сгиб, который возвращает длину вектора.

...