definir la plantilla de función miembro que recibe el puntero a otra función miembro de clase agregar aplicar la función

Tengo una clase A que tiene una variable miembro vector<B>. Quiero definir una plantilla de función llamada DoToAll(funcPtr) eso iterará en todo el vector y aplicará la función.

class A 
{
vector<B> v;
template <?????>
void DoToAll(f);
loop on v and apply the member function f;
}

class B{
void f1();
void f2();
.
.
.
}

Como escribo DoToAll?

preguntado el 12 de junio de 12 a las 22:06

Así que quieres reescribir std::for_each ? -

2 Respuestas

¿Insiste en que el argumento debe ser un puntero de función? De lo contrario, podría ser sólo

template <class F>
void DoToAll(F f) {
  std::for_each(v.begin(), v.end(), f);
}

Eso funciona para todos f st. f(x), Donde x es un elemento del vector, es válido. Eso significa punteros de función y funtores como std::function y std::bind están bien Desafortunadamente, eso no incluye punteros de función miembro, ya que los llama x->*f()no, f(). Pero eso también es posible de superar, envolviendo el puntero de la función miembro en un funtor que reenviaría correctamente la llamada. El estándar ya proporciona este tipo de adaptadores, el adecuado para usted sería mem_fun_ref_t. Podría agregar una sobrecarga de DoToAll que toma punteros de función:

template <class This, class Ret>
void DoToAll(Ret (*This::f)()) {
  std::for_each(v.begin(), v.end(), std::mem_fun_ref(f));
}

Respondido el 13 de junio de 12 a las 10:06

¡Gracias! soy nuevo en c ++, ¿puede for_each trabajar en la función miembro? - Tomer

Si usa solo funciones aquí, no necesita plantillas en absoluto.

void DoToAll(void (*f)(B&)) { /*...*/ }

Entonces puedes escribir algo como esto

void Change(const B& what)
{
    what.ChangeSomething();
}
//...
a.DoToAll(Change) // or a.DoToAll(&Change)

Respondido el 13 de junio de 12 a las 00:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.