Si le conteneur supporte (que je soupçonne que le vôtre ne pas, mais le titre de la question est générique si cela peut être utile à d'autres, sinon vous):
struct SomePredicate {
bool operator()(typedefedcontainer::value_type thing) {
return ! SomeFunction(thing, "test", "TEST", false);
}
};
typedefedcontainer::iterator it;
it = std::remove_if(m_Container.begin(), m_Container.end(), SomePredicate());
m_Container.erase(it, m_Container.end());
m_Container doit avoir une méthode de plage d'effacement , qui comprend toute séquence ou conteneur associatif. Il doit cependant avoir un itérateur mutable, et je viens de remarquer que j'ai mal lu le message d'erreur: il indique "map/set iterator not incrementable". Donc je suppose que votre conteneur est une carte ou un ensemble. Notez que les trois derniers pourraient être un très beau doublage, mais cette marge est trop étroite pour le contenir.
De même que SomePredicate pourrait avoir un constructeur avec des paramètres pour stocker les paramètres supplémentaires à SomeFunction, puisque dans la vraie vie, je suppose qu'ils ne sont pas constants.
Vous pouvez réellement vous débarrasser complètement de SomePredicate si vous utilisez boost: bind pour construire le foncteur. Votre one-liner serait alors vraiment énorme. [Edit: Rob Walker note correctement dans sa réponse une hypothèse que je fais ici et que la question ne précise pas, c'est-à-dire que tout effacement peut être différé jusqu'à ce que l'itération-et-test soit fait. Si SomeFunction accède à m_Container par une route cachée (par exemple un global, ou parce que SomeFunction en est une fonction membre) et que ses résultats dépendent du contenu du conteneur, mon code peut ne pas être équivalent au code de l'interrogateur. Mais je pense que mon code est la valeur par défaut "à moins qu'il y ait une raison de ne pas".]
Pourquoi testez-vous le vide de votre conteneur? Si elle est vide, la boucle for ne sera jamais entrée. –