Pasar predicados de algos estándar por referencia en C ++

Estoy intentando eliminar elementos de una std::list y mantener algunas estadísticas de elementos eliminados.

Para hacerlo, uso la función remove_if de la lista y tengo un predicado. Me gustaría usar este predicado para recostackr estadísticas. Aquí está el código para el predicado:

  class TestPredicate { private: int limit_; public: int sum; int count; TestPredicate(int limit) : limit_(limit), sum(0), count(0) {} bool operator() (int value) { if (value >= limit_) { sum += value; ++count; // Part where I gather the stats return true; } else return false; } }; 

Y aquí está el código para el algo:

 std::list  container; container.push_back(11); TestPredicate pred(10); container.remove_if(pred) assert(pred.count == 1); 

Desafortunadamente, la afirmación es falsa porque el predicado se pasa por valor. ¿Hay alguna forma de forzarlo a pasar por referencia?

Pase un contenedor de referencia, disponible en :

 container.remove_if(std::ref(pred)); 

Si solo tiene C ++ pero su comstackdor tiene TR1, puede usar y std::tr1::ref si hace una pequeña enmienda a su predicado:

 #include  class TestPredicate : public std::unary_function { //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // ... } container.remove_if(std::tr1::ref(pred)); 

Si todo lo demás falla, entonces puede hackear una solución manual con relativa facilidad:

 struct predref { TestPredicate & p; bool operator()(int n) { return p(n); } predref(TestPredicate & r) : p(r) { } }; container.remove_if(predref(pred)); 

Los funtores pasados ​​a los algoritmos pueden copiarse dentro del algoritmo un número indeterminado de veces, por lo que no puede almacenar el estado directamente en el functor. Por otro lado, puede almacenar el estado fuera del functor, utilizando un puntero o una referencia a alguna estructura de estado externa.