Pregunta

Si, por ejemplo, va a escribir una clase de tipo de variante, naturalmente necesitará una identificación de qué tipo lleva una instancia de esa clase. Me pregunto si alguien sabe de alguna referencia oficial o semioficial (¿de facto?) De todos los tipos de datos primitivos en los que uno pueda estar interesado?

Solo primitivos, y no hay necesidad de tipos abstractos como cadena o handle .

Gracias.

¿Fue útil?

Solución

La única referencia oficial es la ISO / IEC 14882 Estándar C ++.

Otros consejos

¿Ha considerado dejar que otra biblioteca haga el trabajo pesado?

Hay Boost.Variant que probablemente sí lo que necesita, totalmente probado, seguro de su tipo, correcto y bastante eficiente.

O si desea hacer su propio rollo, use Boost.TypeTraits

La búsqueda de Google siempre es un buen comienzo. Aquí . Ahora, expanda su pregunta actual.

Utilice cualquier variante de terceros.

Todos los tipos de datos que puede encontrar en el estándar.

No necesita saber nada acerca de los tipos si usa typeid:

#include <typeinfo>
#include <iostream>

using namespace std;

struct var_base
{
    const type_info & t;
    var_base(const type_info & t) : t(t) {};

    virtual ~var_base() {};
};

template<class T> struct var : var_base
{
    T value;

    var(T x) : var_base(typeid(T)), value(x) {};
};

struct variant {
    const static int max_size=16;

    char data[max_size];
    var_base & v;

    variant() : v(*(var_base*)data) {
        new (data) var<int>(0);
    }

    const type_info & getType() { return v.t; }

    template<class T> T & get() {
        assert(getType()==typeid(T));
        return static_cast< var<T> &>(v).value;
    }

    template<class T> void set(const T & value) {
            // Compile time assert is also possible here.
        assert(sizeof(var<T>)<=max_size);
        v.~var_base();
        new (data) var<T>(value);
    }
};

main()
{
    variant v;
    v.set<float>(1.2);
    cout << v.getType().name() << endl;
    cout << v.get<float>();
    cout << v.get<int>(); // Assert fails
}

Tenga en cuenta que puede deshacerse de max_size, si puede aceptar que el valor se asigna dinámicamente. Solo quería mostrar que la asignación en el lugar también funciona, si conoce el tamaño del tipo más grande.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top