Il metodo più semplice che mi viene in mente è usare il vecchio trucco della struttura con un campo che indichi il tipo trasportato e una union per poter memorizzare vari tipi di payload:
codice:
enum PayloadType
{
PT_short,
PT_int,
PT_float,
PT_double,
PT_char
/* ... */
};
/* Struct usata per gli elementi della lista */
struct Item
{
struct BaseItem * Next;
struct BaseItem * Prev;
enum PayloadType PT;
union
{
short s;
int i;
float f;
double d;
char c;
/* ... */
} Payload;
};
Al momento di aggiungere un elemento alla lista sottostante, a seconda del tipo da inserire si imposterà in maniera adeguata il membro PT e si memorizzerà quindi il dato in questione nel membro corretto della union.
Si può fare anche in altre maniere (ad esempio usando strutture diverse che hanno come primo campo la struttura base, un concetto simile all'ereditarietà del C++), ma diventa un po' un casino e in genere non ne vale la pena.