2012-04-23 8 views
11

Ich mache derzeit einen Beweis auf Konzeptproben mit boost :: mpl und habe einige Schwierigkeiten zu verstehen, wie die Lambda-Funktion die Verwendung von Platzhaltern ermöglicht.Boost MPL Placeholders und Lambda

Ich merke, dass ich Metafunktionen in Metafunktionsklassen umbrechen kann, damit Funktionen höherer Ordnung auf die geschachtelte Anwendungsfunktion zugreifen können, und habe erkannt, dass Sie diesen Aufwand vermeiden können, indem Sie mpl :: lambda wrapping die Metafunktion verwenden Inhaber.

Wie funktioniert das eigentlich? Ich habe Schwierigkeiten, meinen Kopf darum zu drehen, was Lamda und Platzhalter eigentlich unter der Decke machen.

Antwort

13

Siehe die Boost.MPL manual: ein Platzhalter ist eine Metafunktionsklasse der Form mpl::arg<X>. Eine Metafunktionsklasse ist eine Klasse, die eine apply Metafunktion enthält.

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 

Es ist die Aufgabe der mpl::lambda Platzhalter Ausdrücke in metafunction Klassen zu drehen. Dies geschieht durch eine metafunction Klasse wie this Einbetten:

template< 
     typename X 
    , typename Tag = unspecified 
    > 
struct lambda 
{ 
    typedef unspecified type; 
}; 

Wenn x ein Platzhalter Expression in einer allgemeinen Form ist X<a1,...an>, wo X ist eine Klassenvorlage und a1,... an sind beliebige Typen, die eingebettete nicht näher bezeichnete Typ f entspricht

typedef protect< bind< 
     quoten<X> 
    , lambda<a1>::type,... lambda<an>::type 
> > f; 

sonst ist f-X identisch. Die Metafunktion apply wertet einen Lambda-Ausdruck durch Zugriff auf den eingebetteten Typ aus. In der MPL manual können Sie auch die Definitionen protect, bind und quote nachschlagen. Sie sind alle Wrapper um ihre Argumente, um die Auswertung so lange wie möglich zu verzögern.

+0

Klare und präzise Antwort - sollte vom OP akzeptiert worden sein. – etherice

+0

Danke, froh, dass ich geholfen habe! – TemplateRex

Verwandte Themen