2009-03-06 17 views
-2

Wenn Sie beispielsweise eine Klasse eines Variantentyps schreiben, benötigen Sie natürlich eine Identifikation darüber, welchen Typ eine Instanz dieser Klasse enthält. Ich frage mich, ob jemand eine offizielle oder halboffizielle (de-facto?) Referenz aller primitiven Datentypen kennt, an denen man interessiert sein könnte?De-facto-Liste primitiver Typen, die in C++ verwendbar sind

Nur Primitive und keine Notwendigkeit für abstrakte Typen wie Zeichenfolge oder Handle.

Danke.

Antwort

3

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

0

Google-Suche ist immer ein guter Anfang. Here. Jetzt rolle deine eigentliche Frage aus.

+1

Ja, leiten Sie alle zur Google-Suche, anstatt Fragen zu StackOVerflow zu stellen. Vielleicht haben Sie die ganze Idee verpasst, warum wir SO wollen und nicht die Google-Suche, Google Groups oder Ähnliches. Wie auch immer, dein Link ist sowieso nicht so gut, kann nicht longlong oder int64 finden, also traue ich der Liste nicht. -1 – sharkin

+0

longlong und int64 sind in C++ nicht definiert. -1 yourself – jalf

+0

Sie sind Compiler/Architektur-spezifische Typen. Sie sprechen über den C++ - ISO-Standard, den ich noch nicht einmal erwähnt habe. – sharkin

0

Verwenden Sie eine beliebige Drittanbieter-Variante.

Alle Datentypen, die Sie im Standard nicht finden können.

4

Haben Sie darüber nachgedacht, eine andere Bibliothek das schwere Heben durchführen zu lassen?

Es gibt Boost.Variant, die wahrscheinlich tun, was Sie brauchen, vollständig getestet, typsicher und korrekt und ziemlich effizient.

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

+0

Danke für den Tipp, aber das ist ein Lernexperiment. – sharkin

0

Sie brauchen 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 akzeptieren können, dass der Wert dynamisch zugewiesen wird. Ich wollte nur zeigen, dass die Platzzuweisung auch funktioniert, wenn Sie die Größe des größten Typs kennen.

Verwandte Themen