11

私は現在、boost :: mplを使用してコンセプトサンプルでいくつかの証明を行っていますが、ラムダ関数がプレースホルダーの使用をどのように可能にするかを理解するのにいくつかの困難があります。

メタ関数をメタ関数クラスでラップして、高階関数がネストされた適用関数にアクセスできるようにすることができ、プレースホルダーを許可するメタ関数をラップするmpl::lambdaを使用することでこの作業を回避できることに気付きました。

これは実際にどのように機能しますか?ラムダとプレースホルダーが実際にカバーの下で行うことについて頭を包むのに苦労しています。

4

1 に答える 1

13

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

于 2012-04-24T14:16:38.177 に答える