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、埋め込み型にアクセスしてラムダ式を評価します。
MPLマニュアルprotectでは、bindとの定義を参照できますquote。それらはすべて、評価を可能な限り遅らせるための引数のラッパーです。