Frage

Wenn zum Beispiel, Sie gehen eine Variante Typklasse zu schreiben, werden Sie natürlich müssen Identifizierung dessen, was eine Instanz dieser Klasse Typ trägt. Ich frage mich, ob jemand weiß, von einem amtlichen oder halbamtlichen (de-facto?) Referenz aller primitiven Datentypen würde man vielleicht interessieren?

Nur Primitiven, und keine Notwendigkeit für abstrakte Typen wie string oder behandeln .

Danke.

War es hilfreich?

Lösung

Die einzige offiziellen Referenz ist die ISO / IEC 14882 C ++-Standard.

Andere Tipps

Haben Sie darüber nachgedacht eine andere Bibliothek im Stich gelassen zu tun, das schwere Heben?

Es gibt Boost.Variant die wahrscheinlich tut was Sie brauchen, völlig geprüft, typsicher und korrekt, und ziemlich effizient.

Oder wenn Sie Ihre eigene Rolle möchten, verwenden Sie Boost.TypeTraits

Google-Suche ist immer ein guter Anfang. Hier . Nun ausrollen Ihre eigentliche Frage.

Verwenden Sie eine beliebige Fremd Variante.

Alle Datentypen in Standard finden.

Sie müssen nichts über Typen wissen, ob Sie typeid verwenden:

#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
}

Beachten Sie, dass Sie von max_size loswerden können, wenn Sie, dass der Wert annehmen kann, wird dynamisch zugewiesen. Ich wollte nur zeigen, dass anstelle Zuordnung funktioniert auch, wenn Sie die Größe der größten Art kennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top