Увеличить MPL вложенные лямбды

Я пытался справиться с повышением MPL .

В качестве простых упражнений я попробовал:

typedef vector_c<int, 1, 2, 3, 4, 5>::type example_list;

typedef transform<example_list, times<_, int_<2> > >::type doubled_example_list;

typedef transform<example_list, negate<_> >::type negated_example_list;

BOOST_STATIC_ASSERT((at_c<negated_example_list, 2>::type::value==-3));
BOOST_STATIC_ASSERT((at_c<doubled_example_list, 4>::type::value==10));

Все это отлично работает. Однако следующая попытка не компилируется:

typedef transform<_, negate<_> > negate_a_list;

typedef apply<negate_a_list, example_list>::type negated_example_list_2;

BOOST_STATIC_ASSERT((at_c<negated_example_list_2, 2>::type::value==-3));

Я думаю, что это как-то связано с областью применения заполнителей в negate_a_list, однако я не уверен, как это исправить. Есть идеи? Я также подозреваю, что некоторые из моих предположений о синтаксисе и семантике MPL ошибочны. Буду благодарен за любые советы по гроккингу MPL.

P.S. Вот преамбула для приведенного выше кода:

#include <boost/mpl/vector_c.hpp>
#include <boost/mpl/transform.hpp>
#include <boost/static_assert.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/times.hpp>
#include <boost/mpl/size_t.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/mpl/lambda.hpp>
#include <boost/mpl/negate.hpp>
#include <boost/mpl/at.hpp>

using namespace boost::mpl;
using namespace boost::mpl::placeholders;
7 голосов | спросил Dylan 18 PMpThu, 18 Apr 2013 20:02:13 +040002Thursday 2013, 20:02:13

1 ответ


0

Благодаря комментарию Люка Турэля по моему вопросу, список рассылки Boost содержит ответ . Этот код работает:

typedef transform<_, lambda<negate<_> >::type > negate_a_list;

typedef apply<negate_a_list, example_list>::type negated_example_list_2;

BOOST_STATIC_ASSERT((at_c<negated_example_list_2, 2>::type::value==-3));

Обратите внимание на добавление lambda<...>::type, обертывающего лямбда-выражение. Этого достаточно, чтобы ограничить область применения заполнителя.

ответил Dylan 18 PMpThu, 18 Apr 2013 20:31:38 +040031Thursday 2013, 20:31:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132