Pregunta

Esto parece inconsistente. ¿Por qué usamos & amp; Example :: func en lugar de Example :: func? ¿hay un uso para Example :: func o & amp; exampleFunction? No parece que podamos hacer una referencia a una función para que descarte Example :: func. y no puedo pensar en una forma de usar & amp; exampleFunction ya que exampleFunction ya devuelve un puntero.

#include <iostream>
class Example {
public:
    void func() { std::cout <<"print me\n"; }
};
void exampleFunction() { std::cout << "print me too\n"; }
typedef void (Example::*ExampleFunc_t)(); 
typedef void (*ExampleFunction_t)();
int main()
{
    Example e;
    ExampleFunc_t     f  = &Example::func;
    ExampleFunction_t f2 = exampleFunction;
    (e.*f)();
    f2();
    return 0;
} 
¿Fue útil?

Solución

Porque así es como el estándar define los punteros a las funciones.

En realidad, siempre tiene que usar el operador de dirección & amp; para obtener un puntero a una función, pero para las funciones regulares y la función miembro estática, una conversión implícita de función a puntero a función es definido en la norma.

Esto no está definido para una función de miembro (no estática) porque no puede obtener un lvalue para una función de miembro no estática.

Desde el estándar de C ++:

  

4.3 Conversión de función a puntero

     
      
  1. Un lvalue del tipo de función T se puede convertir en un rvalue del tipo   "Puntero a T". El resultado es un puntero a la función.
  2.   

con la nota 52:

  

Esta conversión nunca se aplica a funciones miembro no estáticas porque   no se puede obtener un valor de l que se refiere a una función miembro no estática.

Creo que preferirían solo permitir la función & amp; por razones de coherencia, pero que la conversión implícita es simplemente un artefacto de la herencia C ...

Otros consejos

El punto utiliza punteros de función . Para un ejemplo muy aproximado, suponga que tiene una clase con varias variables miembro por las que puede necesitar clasificar los elementos de una matriz de ese tipo de clase, como este:

struct CL {
    int x, y, z;
};

bool sort_by_x(const CL& obj1, const CL& obj2);
bool sort_by_y(const CL& obj1, const CL& obj2);
bool sort_by_z(const CL& obj1, const CL& obj2);

...

CL obj[100];
...
sort(obj, obj+100, sort_by_x);
...
sort(obj, obj+100, sort_by_y);
...
sort(obj, obj+100, sort_by_z);

Aquí std :: sort se usa para ordenar una matriz de objetos CL. Mira el tercer parámetro, es el nombre de una función. La función std :: sort puede tomar un puntero de función en el tercer parámetro, y usar esa función como comparador para ordenar la matriz. Depende de nosotros definir las funciones sort_by_ * para que std :: sort funcione como se esperaba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top