Ebbene, ovviamente un modo per parametrizzare tipi è utilizzare il preprocessore, ad esempio:
#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;
}
Questo implementa due funzioni: divide_double
e divide_int
. In un esempio più complesso (realistico) l'implementazione potrebbe essere in un file di compilazione separato che è compilato (o incluso) separatamente per ogni tipo con un diverso DIVIDE_TYPE
definito.
Lo svantaggio rispetto ai generici reali è che le implementazioni per diversi tipi non vengono generate automaticamente, ovvero DIVIDE_CALL(mytype, x, y)
non causa l'implementazione per mytype
da generare. (Naturalmente questo potrebbe essere organizzato con uno script relativamente semplice, ma si potrebbe sostenere che non si sta più utilizzando C e ci sono linguaggi con generici predefiniti più carini. =)
In ogni caso, questo può funzionare per strutture di dati e tali in cui è desiderato il tipo di dati effettivo (non un puntatore void *
).
Intendi "generici"? http://download.oracle.com/javase/tutorial/extra/generics/index.html –
Si esegue l'aggiornamento a C++ e si utilizzano i modelli, ecco come. – Puppy
@deadMG: so programmare lo stesso utilizzo di generici in C++. Volevo sapere come farlo in C. – Flash