Bueno, obviamente, una forma de parametrizar tipos es utilizar el preprocesador, por ejemplo:
#define DIVIDE_FUNC(type) divide_##type
#define DIVIDE_CALL(type, a, b) DIVIDE_FUNC(type)((a), (b))
#define DIVIDE_DECL(type) type DIVIDE_FUNC(type)(type a, type b)
#define DIVIDE_IMPLEMENTATION DIVIDE_DECL(DIVIDE_TYPE) { return a/b; }
#define DIVIDE_TYPE int
DIVIDE_IMPLEMENTATION
#undef DIVIDE_TYPE
#define DIVIDE_TYPE double
DIVIDE_IMPLEMENTATION
#include <stdio.h>
int main (void) {
int i = 5, j = 2;
(void) printf("int %d/%d = %d\n", i, j, DIVIDE_CALL(int, i, j));
(void) printf("double %d/%d = %f\n", i, j, DIVIDE_CALL(double, i, j));
return 0;
}
Esto implementa dos funciones: divide_double
y divide_int
. En un ejemplo más complejo (realista), la implementación podría estar en un archivo de compilación separado que se compila (o se incluye) por separado para cada tipo con un DIVIDE_TYPE
diferente definido.
La desventaja en comparación con los genéricos reales es que las implementaciones para diferentes tipos no se generan automáticamente, es decir, DIVIDE_CALL(mytype, x, y)
no genera la implementación de mytype
. (Por supuesto, esto podría organizarse con algunas secuencias de comandos relativamente simples, pero entonces se podría argumentar que ya no se está usando C y existen lenguajes con genéricos incorporados más bonitos) =)
En cualquier caso, esto puede funcionar para estructuras de datos y tal, donde se desea el tipo de datos real (no un puntero void *
).
¿Se refiere a "genéricos"? http://download.oracle.com/javase/tutorial/extra/generics/index.html –
Actualiza a C++ y usa plantillas, así es como. – Puppy
@deadMG: sé programar el mismo uso de genéricos en C++. Quería saber cómo hacerlo en C. – Flash