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.
Me encantaría decir 'mem_fun_ref' uso, pero no puedo ver cómo. Buena pregunta. – wheaties
no otra vez ... ¿Por qué todos quieren hacer esto? Nunca he necesitado algo ni siquiera cerca de esto. –
@David: estoy contigo en eso. Recuerdo el uso de punteros de miembros _una vez_ en 15 años de programación en C++. – sbi