2010-01-04 10 views
1

J'ai le code suivant qui utilise une boucle for et je voudrais utiliser transform, ou au moins for_each à la place, mais je ne vois pas comment. Plus tard dans le code, je veux en fait appeler cette collection d'objets de fonction nullary. J'utilise aussi une boucle for, et il me semble que je devrais être capable d'utiliser for_each d'une façon ou d'une autre.Algorithmes STL sur les conteneurs de boost :: objets de fonction

for(CallbackList::iterator itr = callbacks_.begin(); itr != callbacks_.end(); ++itr) 
{  
    (*itr)(); 
} 

Répondre

2

Pour faire tout cela en un seul appel, vous transformer je pense que vous avez besoin d'appeler bind sur lui-même, parce que vous avez besoin d'un foncteur qui appelle boost: bind. C'est quelque chose que je n'ai jamais essayé. Souhaitez-vous vous contenter de quelque chose comme ça (non testé)?

struct GetFunc { 
    ClassOutput *obj; 
    boost::function<void(void) > operator()(const OptionsMap::value_type &v) { 
     return boost::bind(&ClassOutput::write_option_, obj, v); 
    } 
    GetFunc(ClassOutput *obj) : obj(obj) {} 
}; 

transform(options.begin(), options.end(), back_inserter(callbacks_), GetFunc(this)); 

En C++ 0x vous pouvez utiliser un lambda au lieu de la classe foncteur:

transform(options.begin(), options.end(), back_inserter(callbacks_), 
    [this](const OptionsMap::value_type &v) { 
     return boost::bind(&ClassOutput::write_option_, this, v); 
    } 
); 
+0

qui fonctionne avec un seul changement. L'argument de operator() devrait être OptionsMap :: value_type. Merci. –

+0

Correction (15 caractères). –

3

j'ai réussi à comprendre la partie 2:

typedef boost::function<void(void)> NullaryFunc; 
for_each(callbacks_.begin(),callbacks_.end(),boost::bind(&NullaryFunc::operator(),_1)); 
Questions connexes