2010-07-02 18 views
7

me gustaría declarar un puntero de función miembro de C++, que devuelve la misma función miembro de tipo punteropuntero de función miembro que devuelve mismo tipo de puntero de función miembro

Esto no funciona:

class MyClass { 
public: 
     typedef FunctionPtr (MyClass::*FunctionPtr)(); 
} 

¿Alguien sabe una solución?

+0

Me encantaría decir 'mem_fun_ref' uso, pero no puedo ver cómo. Buena pregunta. – wheaties

+1

no otra vez ... ¿Por qué todos quieren hacer esto? Nunca he necesitado algo ni siquiera cerca de esto. –

+0

@David: estoy contigo en eso. Recuerdo el uso de punteros de miembros _una vez_ en 15 años de programación en C++. – sbi

Respuesta

5

No hay forma de lograr exactamente eso. De hecho, las funciones miembro no hacen ninguna diferencia aquí: no hay forma de declarar una función ordinaria que devuelve un puntero a su propio tipo de función. La declaración sería infinitamente recursiva.

En el caso de una función normal, puede utilizar el tipo void (*)() como un tipo de puntero de función "universal" (al igual que void * se utiliza a menudo para tipos de datos). Para los punteros de función de miembro que serían tipo void (A::*)(). Sin embargo, tendrías que usar reinterpret_cast para ese fin. Sin embargo, este uso (una conversión de ida y vuelta) pasa a ser uno cuando se define el comportamiento de reinterpret_cast.

Por supuesto, se le obligó a usar moldes para convertir el puntero hacia y desde ese tipo. AFAIK, hay soluciones elegantes basadas en plantillas con un objeto de plantilla temporal intermedio que hace el casting.

También puede ser que desee echar un vistazo a este GotW entry.

P.S. Tenga en cuenta que el uso del tipo void * como un tipo intermedio para punteros a funciones está prohibido por el lenguaje. Mientras que tal uso ilegal podría parecer "funcional" con los punteros de función ordinarios, no tiene absolutamente ninguna posibilidad de funcionar con punteros de función de miembro. Los punteros de función de miembro normalmente son objetos no triviales con un tamaño mayor que el void * puntero.

0

Lo que estamos tratando de hacer no es posible - el tipo de retorno de la función es el tipo de la misma función, que aún no se conoce, lo que conduce a un ciclo infinito.

5

AndreyT hace referencia a la mejor respuesta a GotW #57, así que bien podría replicar aquí:

class MyClass { 
public: 
     struct FunctionPtrProxy; 
     typedef FunctionPtrProxy (MyClass::*FunctionPtr)(); 

     struct FunctionPtrProxy 
     { 
       FunctionPtrProxy(FunctionPtr pp) : p(pp) { } 
       operator FunctionPtr() { return p; } 
       FunctionPtr p; 
     } 

} 
+2

Es curioso cómo han desaparecido tantas respuestas de "no es posible" ... – Beta

+0

Pude obtener el ejemplo en GoW # 57 para trabajar. Pero si agrego una función de miembro a la clase superior que simplemente se devuelve que no puede compilarse (error de gcc: argumento de tipo 'MyClass :: FunctionPtrProxy (MyClass ::)()' no coincide con 'MyClass :: FunctionPtrProxy'). @MSN podría dar un ejemplo con la clase superior donde tiene una función de miembro que se devuelve y donde se compila, gracias :) –

Cuestiones relacionadas