我目前正在使用boost :: mpl对概念样本进行一些证明,并且在理解lambda函数如何使用占位符方面遇到了一些困难。
我意识到我可以将metafunctions包装在元函数类中,以使更高阶函数能够访问嵌套的apply函数,并且已经意识到你可以通过使用mpl :: lambda包装允许占位符的元函数来避免这种努力。
这实际上是如何工作的?我无法将我的头包裹在lamda和占位符实际上在封面下做什么。
我目前正在使用boost :: mpl对概念样本进行一些证明,并且在理解lambda函数如何使用占位符方面遇到了一些困难。
我意识到我可以将metafunctions包装在元函数类中,以使更高阶函数能够访问嵌套的apply函数,并且已经意识到你可以通过使用mpl :: lambda包装允许占位符的元函数来避免这种努力。
这实际上是如何工作的?我无法将我的头包裹在lamda和占位符实际上在封面下做什么。
见 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中 手册 你可以查找的定义 protect
, bind
和 quote
同样。他们都是围绕他们的论据包装,以尽可能延迟评估。
见 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中 手册 你可以查找的定义 protect
, bind
和 quote
同样。他们都是围绕他们的论据包装,以尽可能延迟评估。