Domanda

Se, ad esempio, stai per scrivere una classe di tipo variante, dovrai naturalmente identificare il tipo che trasporta un'istanza di quella classe. Mi chiedo se qualcuno sia a conoscenza di riferimenti ufficiali o semi-ufficiali (di fatto?) A tutti i tipi di dati primitivi che potrebbero interessare?

Solo primitive e nessuna necessità di tipi astratti come string o handle .

Grazie.

È stato utile?

Soluzione

L'unico riferimento ufficiale è ISO / IEC 14882 Standard C ++.

Altri suggerimenti

Hai pensato di lasciare che un'altra biblioteca esegua il lavoro pesante?

C'è Boost.Variant che probabilmente lo fa ciò di cui hai bisogno, completamente testato, dattiloscritto e corretto e abbastanza efficiente.

Oppure, se vuoi creare il tuo, usa Boost.TypeTraits

Ricerca Google è sempre un buon inizio. Qui . Ora lancia la tua vera domanda.

Utilizza qualsiasi variante di terze parti.

Tutti i tipi di dati che puoi trovare in standard.

Non devi sapere nulla sui tipi se usi 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
}

Nota che puoi eliminare max_size, se puoi accettare che il valore sia allocato dinamicamente. Volevo solo dimostrare che anche l'allocazione sul posto funziona, se conosci la dimensione del tipo più grande.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top