2010-05-15 14 views
9

Ceci est aussi loin que je suis devenu,Comment faire une boucle dans un boost :: mpl :: list?

#include <boost/mpl/list.hpp> 
#include <algorithm> 
namespace mpl = boost::mpl; 

class RunAround {}; 
class HopUpAndDown {}; 
class Sleep {}; 

template<typename Instructions> int doThis(); 
template<> int doThis<RunAround>() { /* run run run.. */ return 3; } 
template<> int doThis<HopUpAndDown>() { /* hop hop hop.. */ return 2; } 
template<> int doThis<Sleep>()  { /* zzz.. */ return -2; } 


int main() 
{ 
    typedef mpl::list<RunAround, HopUpAndDown, Sleep> acts; 

// std::for_each(mpl::begin<acts>::type, mpl::end<acts>::type, doThis<????>); 

    return 0; 
}; 

Comment remplir ce? (Je ne sais pas si je devrais utiliser std :: for_each, juste une supposition basée sur une autre réponse ici)

Répondre

13

Utilisez mpl::for_each pour l'itération d'exécution sur les listes de types. E.g .:

struct do_this_wrapper { 
    template<typename U> void operator()(U) { 
     doThis<U>(); 
    } 
}; 

int main() { 
    typedef boost::mpl::list<RunAround, HopUpAndDown, Sleep> acts; 
    boost::mpl::for_each<acts>(do_this_wrapper());  
}; 
+1

Merci - est-il un moyen de le faire en utilisant boost :: bind au lieu de l'objet wrapper? – Kyle

+2

@Kyle: Je ne pense pas - je ne connais aucun utilitaire dans Boost.Bind qui vous génère les foncteurs requis avec un 'template()' basé sur un template. –

+0

@GeorgFritzsche: Existe-t-il un moyen de faire de 'do_this_wrapper' un lambda (à partir de C++ 11/14/17)? –