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.
Простое упражнение состоит в том, чтобынаписать сгиб, который возвращает длину вектора.