2010-09-22 16 views
6

¿Es posible utilizar el tipo de función declarada como un puntero a función sin usar un typedef?puntero de función sin typedef

declaración de la función:

int myfunc(float); 

uso de la declaración de la función mediante una sintaxis como puntero de función

myfunc* ptrWithSameTypeAsMyFunc = 0; 
+0

¿Desea un puntero de función que solo pueda apuntar a su propia función desplegada? – wheaties

+0

@wheaties Quiero un puntero a una función con la misma firma que myfunc –

+1

¿Sabía que puede aplicar 'typedef' a declaraciones de funciones para typedef su tipo? 'typedef int myfunc (float); myfunc * ptrWithSameTypeAsMyFunc = 0; '? La mayoría de las personas no son conscientes de esto y creen que necesitan la sintaxis fea '(* foo)'. –

Respuesta

20

No según la norma 2003. Sí, con el próximo estándar de C++ 0x y MSVC 2010 y g ++ 4.5:

decltype(myfunc)* ptrWithSameTypeAsMyFunc = 0; 
+0

se ve bien - comprobará esto ... –

+0

el problema es que mi código no se compila con C++ 0x habilitado. Así que esta no es una solución utilizable para mí: S –

+0

Con g ++ puede usar 'typeof (myfunc)' en lugar de 'decltype (myfunc)' y funciona incluso en modo no C++ 0x. –

6

Sí, es posible declarar un puntero de función sin un typedef, pero no, no es posible utilizar el nombre de una función para hacer eso.

El typedef se usa generalmente porque la sintaxis para declarar un puntero a la función es un poco barroca. Sin embargo, el typedef no es obligatorio. Se puede escribir:

int (*ptr)(float); 

para declarar ptr como un puntero de función a una función de tomar y devolver floatint - sin typedef está involucrado. Pero, de nuevo, no hay sintaxis que le permita usar el nombre myfunc para hacer esto.

0
int (*ptrWithSameTypeAsMyFunc)(float) = 0; 

Consulte here para obtener más información sobre los conceptos básicos.

1

No, no en este momento. C++ 0x cambiará el significado de auto y agregará una nueva palabra clave decltype que le permite hacer cosas como esta. Si está utilizando gcc/g ++, también puede considerar el uso de su operador typeof, que es bastante similar (tiene una diferencia sutil cuando se trata de referencias).

1

No, no exento de C++ 0x decltype:

int myfunc(float) 
{ 
    return 0; 
} 

int main() 
{ 
    decltype (myfunc) * ptr = myfunc; 
} 
1

gcc tiene typeof como una extensión de C (no sé sobre C++) (http://gcc.gnu.org/onlinedocs/gcc/Typeof.html).

int myfunc(float); 

int main(void) { 
    typeof(myfunc) *ptrWithSameTypeAsMyFunc; 
    ptrWithSameTypeAsMyFunc = NULL; 
    return 0; 
} 
+4

GCC no necesita la extensión 'typeof' en C++ porque implementa el' (pronto a ser estándar) 'decltype', que tiene el mismo propósito. – MSalters

3

¿Es Posible utilizar el tipo de una función prefiously declarado como un puntero de función sin necesidad de utilizar un typedef?

voy a engañar un poco

template<typename T> 
void f(T *f) { 
    T* ptrWithSameTypeAsMyFunc = 0; 
} 

f(&myfunc); 

Por supuesto, esto no es completamente sin trampas: Utiliza la función, por lo que debe ser definida, mientras que cosas tales como decltype no utilizan la función y no requiere que se defina la función.

Cuestiones relacionadas