2014-07-25 30 views
7

Biorąc poniższy przykład, zastanawiam się, czy istnieje alternatywa dla boost::mpl::for_each, która wywołuje funkcję Functor bez żadnych argumentów.boost :: mpl :: for_each bez tworzenia instancji

#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()); 

Wygląda na to, że for_each jest domyślną instancją typów.

Odpowiedz

8

Zastosowanie boost::type i mpl::_ stworzyć lambda MPL który przekształca każdy typ na liście przed instancji elementy i wywołanie funkcji, takich jak to:

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

Registrator powinien wyglądać mniej więcej tak:

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

Nadzieję, że pomaga.

+0

Dzięki, działa jak czar :) – abergmeier

0

Należy użyć for_each trzech parametrów:

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

Następnie przypadki otrzymasz będzie single_view.

+0

Kod niestety nie działa. Nie mogę również znaleźć żadnego przykładu, jak poprawnie użyć 'single_view'. – abergmeier

+0

Poza tym wygląda na to, że przekazujesz tylko częściowo wpisany szablon. – abergmeier

Powiązane problemy