2014-07-25 5 views
7

En prenant l'exemple suivant, je me demande s'il existe une alternative à boost::mpl::for_each, qui appelle un Functor sans aucun argument.boost :: mpl :: for_each sans instanciation

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

Il semble que for_each est par défaut-instancier les types.

Répondre

8

Utilisez boost::type et mpl::_ pour créer un lambda MPL qui transforme chaque type dans la liste avant instancier les éléments et appelant la fonction, comme ceci:

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

Registrator devrait ressembler à ceci:

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

Espérons que cela aide.

+0

Merci, fonctionne comme un charme :) – abergmeier

0

Vous devez utiliser les trois paramètres for_each:

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

Ensuite, les instances que vous obtenez seront de single_view.

+0

Le code ne fonctionne malheureusement pas. Je ne trouve pas non plus d'exemple pour utiliser correctement 'single_view'. – abergmeier

+0

En outre, il semble que vous passez un modèle partiellement typé, seulement. – abergmeier

Questions connexes