2012-07-17 11 views
8

Sono nuovo di C++. Leggo molto spesso da alcuni siti che il membro variante ?.qual è il membro della variante in C++?

class School 
{ 
    int x; -> data member. 
} 

So membro di dati. ma che cos'è un membro variante?

NOTA: Dalla specifica C++: in pagina Constructor.

X is a union-like class that has a variant member with a non-trivial default constructor. 
+6

Puoi pubblicare un link a uno di questi siti? – Praetorian

+0

Stack Overflow stesso è uno di questi. – BlackVegetable

+0

Stai parlando di 'boost :: variant' o qualcosa del genere? Tradizionalmente, una variante è un'unione che contiene tutti i tipi supportati. – chris

risposta

11

"membro Variante" è definito in 9,5/8 di C++ 11:

Una classe unione simile è un sindacato o di una classe che ha un'unione anonima come membro diretto. Una classe X simile a un sindacato ha un insieme di membri varianti. Se X è un'unione, i suoi membri varianti sono i membri dati non statici; altrimenti, i suoi membri variante sono i membri di dati non statici di tutte le unioni anonime che sono membri di X.

In altre parole, tutti i membri di dati non statici di un'unione sono "membri variante", e per una classe che contiene unioni anonime, i loro membri di dati non statici sono "membri varianti" della classe.

Il contesto che hai citato è 12.1/5, dicendo che se una classe simil-unionista ha un membro variante con un costruttore predefinito non banale, allora il costruttore predefinito della classe stessa viene cancellato. Il problema è quale componente variante deve essere creato dal costruttore predefinito della classe e la soluzione non deve avere un costruttore predefinito. Se tutti i membri delle varianti hanno costruttori di base banali non c'è alcun problema, poiché non facendo nulla il costruttore predefinito della classe sta costruendo tutti/nessuno di loro allo stesso modo.

boost::variant è una cosa separata. Non sarei troppo sorpreso se "alcuni siti" dicessero "membri varianti" quando significano "i possibili tipi che un dato boost::variant può contenere", vale a dire i "membri" di quello variant. Ma questo non è il significato recentemente definito nello standard C++ 11.

+0

Steve, grazie per la risposta. Cercando di ottenere più chiarezza dal tuo commento. Quindi per dire union {int x; int y}, in questo entrambi x, y sono i membri varianti. Ho ragione? – Whoami

+0

@Whoami: è corretto. –

7

Il termine variante è solitamente utilizzato per identificare un elemento che può contenere un valore di un insieme di diversi tipi. Simile a un union nella lingua, il termine variant è solitamente riservato per i tipi che consentono la memorizzazione delle diverse opzioni in un modo sicuro.

Si consiglia di leggere la documentazione della libreria di varianti boost per uno di questi esempi e, se questo non risolve il concetto, rilasciare un commento/creare una domanda con i propri dubbi.

Boost Variant

2

Una variante è una struttura contenente un membro di unione e un elemento intero senza segno che descrive quale membro dell'unione è attualmente utilizzato. Se non sai cos'è un'unione, prima leggi prima e poi torna indietro.

Problemi correlati