El siguiente código, creo, describe lo que estoy tratando de hacer. Específicamente, deseo convertir un puntero de función en un tipo de función genérico, con la única diferencia en la firma de diferentes tipos de puntero.punteros de funciones de fundición con diferentes tipos de punteros como un argumento
Ahora, soy consciente de que no es un requisito para los punteros de función para ser compatibles como se discute en this question, pero no estoy seguro de si tienen un argumento de diferentes satisface tipo puntero que requisito de compatibilidad.
El código se compila y se ejecuta, pero, como se espera, proporciona advertencias sobre la asignación desde un tipo de puntero incompatible. ¿Hay alguna manera de satisfacer al compilador y lograr lo que busco?
#include <stdio.h>
int float_function(float *array, int length)
{
int i;
for(i=0; i<length; i++){
printf("%f\n", array[i]);
}
}
int double_function(double *array, int length)
{
int i;
for(i=0; i<length; i++){
printf("%f\n", array[i]);
}
}
int main()
{
float a[5] = {0.0, 1.0, 2.0, 3.0, 4.0};
double b[5] = {0.0, 1.0, 2.0, 3.0, 4.0};
int (*generic_function)(void*, int) = NULL;
generic_function = &float_function;
generic_function(a, 5);
generic_function = &double_function;
generic_function(b, 5);
return 0;
}
De hecho, había pensado en eso. El problema es que estoy llamando a una biblioteca (¡que puede tener una gran cantidad de problemas en sí misma!). En consecuencia, necesitaría ajustar cada función que estoy llamando por separado, que era una especie de lo que intentaba evitar (aunque todavía mantiene la lógica interna simple). –
No había pensado en el caso de la función de la biblioteca. Será difícil mantener contentos tanto al compilador como al lector humano.Tal vez las funciones de envoltura (o los horribles preprocesadores-hacks ;-) sean la forma correcta. – wildplasser
Acepto que una función de envoltura es el método más limpio. Un poco más de código, pero tiene una buena separación lógica. También me permite cambiar la firma e incluir el código en el contenedor. –