2012-07-17 11 views
8

Soy nuevo en C++. Leo con mucha frecuencia desde algunos sitios ese miembro de la variante ?.¿Qué es un miembro variante en C++?

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

Sé el miembro de datos. pero, ¿qué es un miembro variante?

NOTA: De la especificación C++: en la página Constructor.

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

¿Puedes publicar un enlace a uno de estos sitios? – Praetorian

+0

Stack Overflow en sí es uno de ellos. – BlackVegetable

+0

¿Estás hablando de 'boost :: variant' o algo así? Tradicionalmente, una variante es una unión que contiene todos los tipos soportados. – chris

Respuesta

11

"miembro Variante" se define en 9,5/8 de C++ 11:

Una clase unión-como es una unión o una clase que tiene una unión anónima como miembro directo. Una clase X de tipo sindical tiene un conjunto de miembros variantes. Si X es una unión, sus miembros variantes son los miembros de datos no estáticos; de lo contrario, sus miembros variante son los miembros de datos no estáticos de todos los sindicatos anónimos que son miembros de X.

En otras palabras, todos los miembros de datos no estáticos de una unión son "miembros variantes", y para una clase que contiene uniones anónimas, sus miembros de datos no estáticos son "miembros variantes" de la clase.

El contexto que citó es 12.1/5, indicando que si una clase similar a un sindicato tiene un miembro de variante con un constructor predeterminado no trivial, entonces se elimina el constructor predeterminado de la clase. El problema es cuyo miembro de variante debe ser construido por el constructor predeterminado de la clase, y la solución no es tener un constructor predeterminado. Si todos los miembros de la variante tienen constructores triviales predeterminados, no hay problema, ya que al no hacer nada, el constructor predeterminado de la clase está construyendo todos/ninguno de ellos por igual.

boost::variant es algo separado. No me sorprendería mucho si "algunos sitios" dicen "miembros variantes" cuando significan "los posibles tipos que puede contener un determinado boost::variant", es decir, los "miembros" de ese variant. Pero ese no es el significado recién definido en el estándar C++ 11.

+0

Steve, gracias por la respuesta. Intentando obtener más claridad de tu comentario. Entonces para decir union {int x; int y}, en esto, ambos x, y son los miembros variantes. ¿Estoy en lo correcto? – Whoami

+0

@Whoami: eso es correcto. –

7

El término variante se emplea generalmente para identificar un miembro que puede contener un valor de un conjunto de tipos diferentes. Similar a union en el lenguaje, el término variant generalmente se reserva para los tipos que permiten el almacenamiento de las diferentes opciones de una manera segura.

Es posible que desee leer la documentación de la biblioteca de variantes de impulso para un ejemplo, y si eso no aclara el concepto, suelte un comentario/cree una pregunta con sus dudas.

Boost Variant

2

Una variante es una estructura que contiene un miembro de unión y un miembro de entero sin signo que describe que se está utilizando actualmente miembro de la unión. Si no sabe qué es una unión, léala primero y luego vuelva.

Cuestiones relacionadas