2012-04-23 10 views
11

は、私は現在、ブースト:: MPLとのコンセプトのサンプルのいくつかの証拠をやっているし、ラムダ関数は、プレースホルダを使用することができますどのように理解する上でいくつかの困難を持っています。ブーストMPLプレースホルダとラムダ

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

これはどのように実際に動作しますか?ラムダとプレースホルダが実際にカバーしていることを頭の中で包み込むのに問題があります。

答えて

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; 

そうでない場合は、fXと同じです。 applyメタ機能は、埋め込み型にアクセスしてラムダ式を評価します。

MPL manualでは、protect,bindおよびquoteの定義も参照できます。彼らは、できるだけ評価を遅らせるために、議論の周りにすべてラッパーです。

+0

明確で簡潔な答えは - OPに受け入れられている必要があります。 – etherice

+0

ありがとう、助けになってうれしい! – TemplateRex

関連する問題