Esatto.
Quindi il primo problema e': come si fa a sapere che cosa c'e' in un certo momento in un oggettto di tipo "variant"?
Guardando solo l'union, non si puo'!
Questa conoscenza deve essere da qualche altra parte: o nella logica del programma stesso (in un certo momento usi l'intero e sai che lo stai usando), o in un flag messo da qualche parte.
Nell'esempio precedente, nel campo 'tipo' .
Altro esempio che ho implementato proprio questa mattina:
ho la seguente struttura dati (non ho usato questa, ma una piu' complessa, ma il concetto e' lo stesso):
struct S
{
long n;
long *p;
};
dove 'n' e' il numero di elementi del vettore puntato da 'p'
Fintanto che 'n'>1 va tutto bene e non si puo' fare altrimenti.
Ma se 'n' e' 1, avrei un gran spreco di memoria (immagina di avere 10^9 istanze di S ) perche' dovrei allocare lo spazio per S PIU' lo spazio per un vettore di UN elemento.
se invece uso:
struct S
{
long n
union {
long v;
long *p
}
}
ecco che posso risparmiare bel il 30% di memoria allocata.
Dirai, ma con 16GB o 32GB di ram che te ne frega di risparmiare il 30% di memoria!
Ebbene l'applicazione su cui sto lavorando richiede un sacco di memoria, e piu' riesco a risparmiare, piu' grande e' il problema che posso risolvere