2014-07-25 12 views
7

Im folgenden Beispiel frage ich mich, ob es eine Alternative zu boost::mpl::for_each gibt, die einen Functor ohne Argumente aufruft.boost :: mpl :: for_each ohne Instanziierung

#include <boost/mpl/vector.hpp> 
#include <boost/mpl/for_each.hpp> 

struct EasyFixEngineA { static const char* const name() { return "a"; } }; 
struct EasyFixEngineB { static const char* const name() { return "b"; } }; 

struct Registrator { 
    // Would prefer a template<class T> void operator()() 
    template<class T> void operator()(T t) { 
     RegisterInFactory<EasyFixEngine, T> dummy(T::name()); 
    } 
}; 

// ... 
typedef boost::mpl::vector<EasyFixEngineA,EasyFixEngineB> Engines; 
boost::mpl::for_each<Engines>(Registrator()); 

Es scheint, wie for_each ist default-Instanziierung die Typen.

Antwort

8

Verwenden boost::type und mpl::_ eine MPL Lambda zu schaffen, die jeden Typ in der Liste transformiert, bevor die Elemente Instanziieren und Aufrufen der Funktion, wie folgt aus:

mpl::for_each<Engines, boost::type<mpl::_> >(Registrator()); 

Registrator sollte wie folgt aussehen:

struct Registrator 
{ 
    template<typename T> 
    void operator()(boost::type<T>) const 
    { 
     RegisterInFactory<EasyFixEngine, T> dummy(T::name()); 
    } 
}; 

Hoffe, dass hilft.

+0

Danke, funktioniert wie ein Charme :) – abergmeier

0

Sie sollten die for_each drei Parameter verwenden:

mpl::for_each<Engines,mpl::single_view>(Registrator()) 

die Instanzen, die Sie dann werden von single_view bekommen.

+0

Der Code funktioniert leider nicht. Ich kann auch kein Beispiel finden, wie man 'single_view' richtig benutzt. – abergmeier

+0

Außerdem scheint es, als würden Sie nur eine teilweise typisierte Vorlage übergeben. – abergmeier