问题 提升MPL占位符和Lambda


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

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

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


2461
2018-04-23 03:16


起源



答案:


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 metafunction通过访问嵌入类型来评估lambda表达式。

在MPL中 手册 你可以查找的定义 protectbind 和 quote 同样。他们都是围绕他们的论据包装,以尽可能延迟评估。


13
2018-04-24 14:16



清晰简洁的答案 - 应该已被OP接受。 - etherice
谢谢,很高兴得到帮助! - TemplateRex


答案:


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 metafunction通过访问嵌入类型来评估lambda表达式。

在MPL中 手册 你可以查找的定义 protectbind 和 quote 同样。他们都是围绕他们的论据包装,以尽可能延迟评估。


13
2018-04-24 14:16



清晰简洁的答案 - 应该已被OP接受。 - etherice
谢谢,很高兴得到帮助! - TemplateRex