推动MPL占位符和Lambda

Bla*_*son 11 c++ lambda boost boost-mpl template-meta-programming

我目前正在使用boost :: mpl对概念样本进行一些证明,并且在理解lambda函数如何使用占位符方面遇到了一些困难.

我意识到我可以将metafunctions包装在元函数类中,以使更高阶函数能够访问嵌套的apply函数,并且已经意识到你可以通过使用mpl :: lambda包装允许占位符的元函数来避免这种努力.

这实际上是如何工作的?我无法将我的头包裹在lamda和占位符实际上在封面下做什么.

Tem*_*Rex 13

请参阅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
Run Code Online (Sandbox Code Playgroud)

mpl::lambda将占位符表达式转换为元函数类是一项工作.这是通过嵌入元函数类喜欢做这样:

template<
      typename X
    , typename Tag = unspecified
    >
struct lambda
{
    typedef unspecified type;
};
Run Code Online (Sandbox Code Playgroud)

如果x是一般形式的占位符表达式X<a1,...an>,其中X是类模板并且a1,... an是任意类型,则嵌入的未指定类型f等效于

typedef protect< bind<
      quoten<X>
    , lambda<a1>::type,... lambda<an>::type
> > f;
Run Code Online (Sandbox Code Playgroud)

否则,f是相同的X.所述apply元函数通过访问埋入型评估lambda表达式.

在MPL 手册,你可以查找的定义protect,bindquote为好.他们都是围绕他们的论点的包装者,以尽可能地延迟评估.