enum - Sintaxis de firma de función miembro de typedef de C++
typedef ppt (5)
Bueno, básicamente, no puede funcionar (al menos no conozco g ++); Usando el compilador de borland c ++ estaría la palabra clave __closure.
La razón por la que no se compila es que el tamaño del puntero de función (en una máquina x86) ocupa siempre <<32bits>>; pero si desea apuntar a una firma de clase (interfaz), el tamaño debe ser de 64 bits: 32 bits para este puntero (ya que la interfaz de clase está en la memoria solo una vez) y 32 bits para la función real
Pero la palabra clave __closure es un ''hack'' de lenguaje bcb no estandarizado ...
Quiero declarar la definición de tipo para una firma de función miembro. La función global typedefs se ve así:
typedef int (function_signature)(int, int);
typedef int (*function_pointer) (int, int);
Pero no puedo hacer lo mismo para una función miembro:
typedef int (foo::memberf_signature)(int, int); // memberf_pointer is not a member of foo
typedef int (foo::*memberf_pointer)(int, int);
Me suena lógicamente, porque "foo ::" es la sintaxis para acceder a un miembro de la clase foo. ¿Cómo puedo typedef solo la firma?
Esto funciona para mi:
#include <iostream>
class foo
{
public:
int g (int x, int y) { return x + y ; }
} ;
typedef int (foo::*memberf_pointer)(int, int);
int main()
{
foo f ;
memberf_pointer mp = &foo::g ;
std::cout << (f.*mp) (5, 8) << std::endl ;
}
La razón por la que no funciona con su sintaxis actual es que la precedencia del operador determina que se está refiriendo a una función llamada foo::memberf_signature
, no a ningún tipo de tipo.
No estoy seguro de si puedes hacer esto o no, pero no pude encontrar ninguna combinación de parentesco que haya inducido a compilar el código con g ++ 4.2.
Para las preguntas relacionadas con la incómoda sintaxis de los punteros de función, personalmente uso una hoja de trucos: El tutorial de punteros de función ( descargable aquí , gracias a Vector por señalarlo).
Sin embargo, la firma de una función miembro es un poco diferente de la firma de una función regular, como usted experimentó.
Como probablemente sepa, una función miembro tiene un parámetro oculto, this
, cuyo tipo debe especificarse.
typedef int (Foo::*Member)(int, int);
le permite especificar que el primer elemento pasado a la función será un Foo*
(y, por lo tanto, su método realmente toma 3 argumentos, cuando lo piensa, no solo 2.
Sin embargo, también hay otra razón para forzarte a especificar el tipo.
Un puntero de función puede referirse a una función virtual, en cuyo caso las cosas pueden complicarse bastante. Por lo tanto, el tamaño mismo de la representación en memoria cambia según el tipo de función. De hecho, en Visual Studio, el tamaño del puntero de una función puede variar entre 1 y 4 veces el tamaño de un puntero normal. Esto depende de si la función es virtual, notablemente.
Por lo tanto, la clase a la que se refiere la función es parte de la firma y no hay una solución alternativa.
Puede factorizar la clase objetivo en C ++ moderno (post 11) utilizando las cualidades ''typedefing'' de los alias de plantilla . Lo que necesitas se vería así:
template<typename T>
using memberf_pointer = int (T::*)(int, int);
Sin embargo, en el punto de declaración, un puntero a la función miembro que utiliza esta sintaxis deberá especificar la clase de destino:
// D is a member function taking (int, int) and returning int
memberf_pointer<foo> mp = &foo::D;