我目前正在使用boost :: mpl对概念样本进行一些证明,并且在理解lambda函数如何使用占位符方面遇到了一些困难。
我意识到我可以在元函数类中包装元函数以使更高阶函数能够访问嵌套的apply函数,并且已经意识到你可以通过使用mpl :: lambda包装允许占位符的元函数来避免这种努力
这实际上如何运作?我无法将我的头围绕着lamda和占位符实际上在幕后做什么。
答案 0 :(得分:13)
请参阅Boost.MPL manual:占位符是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
的工作是将占位符表达式转换为元函数类。这是通过嵌入像this这样的元函数类来完成的:
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
元函数通过访问嵌入类型来评估lambda表达式。
在MPL manual中,您还可以查找protect
,bind
和quote
的定义。他们都是围绕他们的论据包装,以尽可能延迟评估。