2011-10-27 6 views
5

He estado navegando por algunas de las preguntas aquí y encontré un código de muestra que pasó (lo que parece) un entero emitido como tipo vacío como parámetro de tipo para un objeto con plantilla. He aquí un ejemplo de lo que quiero decir:En cuanto a los parámetros de tipo de plantilla en C++

SomeRandomObject<void(int)> Object; 

Le agradecería que si alguien podría explicar el "vacío (int)" parte del código y lo que hace.

Respuesta

7

Ese tipo es "función que toma un int y devuelve void".

+0

Ok. Gracias por la ayuda. –

2

El tipo es un tipo de función. Puede no ser tan familiarizados con él, ya que hasta ahora sólo se ha utilizado en los tipos de puntero:

typedef int (ft)(void); // Huh? (raw function type) 
typedef ft *fp;   // ??? (pointer to function) 

typedef int (*fp_oldstyle)(void); // Ahh... (same as fp) 

Funciones sí sí tienen tipos, pero ya no se puede declarar variables de ese tipo o referencias a ella, el único Lo que normalmente usaría son punteros, que se declaran en la sintaxis familiar en la última línea. Para cualquier función int foo(void);, tanto foo como &foo se interpretan como el puntero, por lo que no se necesita la función "en bruto" tipo ft.

Sin embargo, con la nueva plantilla mágica que rodea a std::function, std::bind y lambdas, ahora es mucho más común ver los tipos de funciones desnudas en los parámetros de la plantilla.

+0

Es posible tener una referencia de función. – AraK

+0

@AraK: Ah, eso es cierto: ft & f = foo; F();. ¡Gracias! No parece ser usado mucho, sin embargo; Supongo que debido a que las referencias no son reasignables. –

+0

Estoy de acuerdo, lo he visto con poca frecuencia. Pregunta relacionada mía: http://stackoverflow.com/questions/1516958/could-someone-please-explain-the-difference-between-a-reference-and-a-pointer – AraK

Cuestiones relacionadas