我目前正在使用 boost::mpl 对概念样本进行一些证明,并且在理解 lambda 函数如何启用占位符时遇到一些困难。
我意识到我可以将元函数包装在元函数类中以使高阶函数能够访问嵌套的应用函数,并且已经意识到可以通过使用 mpl::lambda 包装允许占位符的元函数来避免这种工作。
这实际上是如何工作的?我很难理解 lamda 和占位符在幕后实际所做的事情。
我目前正在使用 boost::mpl 对概念样本进行一些证明,并且在理解 lambda 函数如何启用占位符时遇到一些困难。
我意识到我可以将元函数包装在元函数类中以使高阶函数能够访问嵌套的应用函数,并且已经意识到可以通过使用 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
函数通过访问嵌入类型来评估 lambda 表达式。
在 MPL手册protect
中,您还可以查找 和 的bind
定义quote
。他们都是围绕他们的论点的包装器,以尽可能长时间地延迟评估。