2010-04-04 5 views
3

Je me demande comment implémenter ce qui est indiqué dans le titre. J'ai essayé quelque chose comme ...std :: for_each sur une fonction membre avec 1 argument

std::for_each(a.begin(), a.end(), std::mem_fun_ref(&myClass::someFunc))

mais je reçois une erreur disant que le « terme » (I "m en supposant que cela signifie le 3ème argument) n'évalue pas à une fonction avec 1 argument , même si someFunc prend un argument - le type des objets stockés dans a

Je me demande si ce que j'essaie de faire est possible en utilisant la bibliothèque standard (je sais que je peux le faire facilement en utilisant boost PS utilise for_each et mem_fun_ref ont des implications de performance par rapport à simplement itérer par a manuellement et en passant l'objet à someFunc?

Répondre

2

Même si someFunc est un membre avec un paramètre, mem_fun_ref utilise un premier argument implicite de "myClass". Vous voulez utiliser les éléments du vecteur comme 2ème argument.

L'utilisation de for_each et de mem_fun_ref n'a probablement pas d'incidence négative sur les performances. Le compilateur va générer du code comparable. Mais, la seule façon d'être sûr est de faire un benchmark :)

std::for_each(a.begin(), a.end(), 
       std::bind1st(
        std::mem_fun_ref(&MyClass::SomeFunc), 
        my_class)); 
+0

Je suppose que j'utiliserais alors bind2nd. Maintenant, je pense à comment spécifier comment utiliser l'élément courant dans l'itération pour cela. Je pense que je vais utiliser boost .. – Person

+0

Non, utilise toujours bind1st. mem_fun_ref devient une fonction avec deux arguments. Le premier est MyClass, le second est votre fonction membre param. Vous voulez lier le premier argument à mem_fun_ref à votre instance de classe. – Stephen

+1

@Person: Si vous utilisez Boost, je vous recommande d'utiliser leur macro foreach. 'std :: for_each' était simplement une idée échouée, et conduit souvent à plus de diffusion, plus difficile à lire le code. – GManNickG

1

Je pense que vous devez utiliser bind_1st pour fournir l'argument caché "this". Ou voulez-vous dire que l'argument "this" est le seul, someFunc n'a pas de paramètres propres?

+0

Quelque chose a un paramètre. Comme myClass :: someFunc (someType). – Person

Questions connexes