Boost MPL Placeholders и Lambda

В настоящее время я делаю некоторые доказательства на концептуальных примерах с boost::mpl, и у меня есть некоторые трудности с пониманием того, как лямбда-функция позволяет использовать заполнители.

Я понимаю, что могу обернуть метафункции в классы метафункций, чтобы функции более высокого порядка могли получить доступ к вложенной функции применения, и понял, что вы можете избежать этих усилий, используя mpl::lambda, обертывая метафункцию, которая позволяет заполнители.

Как это работает на самом деле? У меня проблемы с пониманием того, что лямда и заполнители на самом деле делают под одеялом.


person Blair Davidson    schedule 23.04.2012    source источник


Ответы (1)


См. руководство по Boost.MPL: заполнитель – это класс метафункции вида mpl::arg<X>. Класс метафункции — это класс, содержащий метафункцию apply.

template <int N> struct arg; // forward declarations
struct void_;

template <>
struct arg<1>
{
    template <
      class A1, class A2 = void_, ... class Am = void_>
    struct apply
    {
        typedef A1 type; // return the first argument
    };
};
typedef arg<1> _1

Задача mpl::lambda состоит в том, чтобы превратить выражения-заполнители в классы метафункций. Это делается путем встраивания класса метафункции, подобного этот:

template<
      typename X
    , typename Tag = unspecified
    >
struct lambda
{
    typedef unspecified type;
};

Если x — выражение-заполнитель в общей форме X<a1,...an>, где X — шаблон класса, а a1,... an — произвольные типы, встроенный неопределенный тип f эквивалентен

typedef protect< bind<
      quoten<X>
    , lambda<a1>::type,... lambda<an>::type
> > f;

в противном случае f идентично X. Метафункция apply оценивает лямбда-выражение, обращаясь к встроенному типу.

В руководстве MPL вы можете также найдите определения protect, bind и quote. Все они являются обертками вокруг своих аргументов, чтобы отсрочить оценку как можно дольше.

person TemplateRex    schedule 24.04.2012
comment
Четкий и краткий ответ - должен был быть принят ОП. - person etherice; 06.11.2013
comment
Спасибо, рад, что был полезен! - person TemplateRex; 07.11.2013