Me parece que vi algo raro que se hace en una biblioteca de impulso y terminó siendo exactamente lo que estoy tratando de hacer ahora. No puede encontrarlo aunque ...Eliminar una lista de parámetros de f (lista) con el preprocesador
Quiero crear una macro que lleva una firma y lo convierte en una función de puntero:
void f(int,int) {}
...
void (*x)(int,int) = WHAT((f(int,int)));
x(2,4); // calls f()
especial me necesitará para trabajar con punteros de función miembro de modo que lo que tiene dos parametros:
WHAT(ClassType, (f(int,int)); // results in static_cast<void (ClassType::*)(int,int)>(&ClassType::f)
no es absolutamente necesario con el fin de resolver mi problema, pero sería hacer las cosas un tacto más agradable.
Esta pregunta no tiene nada, per-se, que ver con los punteros de función. Lo que hay que hacer es usar el preprocesador para tomar "f (int, int)" y convertirla en dos partes diferentes:
'f' '(int, int)'
por qué:
he resuelto el problema crió aquí: Generating Qt Q_OBJECT classes pragmatically
he comenzado una serie de artículos que explican cómo hacerlo: http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals-in-qt-step-1.html http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals-in-qt-step-2.html
La firma debe evaluarse y coincidir exactamente con la "señal" con la que el usuario intenta conectarse. Los usuarios de Qt están acostumbrados a expresar esto como SIGNAL(fun(param,param))
, por lo que algo como connect_static(SIGINFO(object,fun(param,param)), [](int,int){})
no sería demasiado extraño.
Para construir la firma, necesito poder sacarla de los argumentos proporcionados. Hay suficiente información para obtener la dirección de función del miembro (utilizando decltype de C++ 0x) y buscar la firma para generar el contenedor apropiado, pero no puedo ver cómo sacarlo. Lo más cercano que se me ocurre es SIGINFO(object, fun, (param,param))
, que probablemente sea lo suficientemente bueno, pero pensé que lo haría antes de considerar imposible obtener la sintaxis exacta que prefiero.
Hmm, Originalmente no entendí ... Así que explícitamente tiene que ser el argumento "(f (int, int))" - ¿se están generando de alguna manera? – villintehaspam
Buena pregunta, una vez también tuve un requisito similar. Esperando respuesta. –
Puede resolver este problema con 'boost :: function_traits' y' boost :: function_types :: parameter_types', pero no estoy seguro de si cumple con la estipulación del preprocesador. –