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
。それらはすべて、評価を可能な限り遅らせるための引数のラッパーです。