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.
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
longlong und int64 sind in C++ nicht definiert. -1 yourself – jalf
Sie sind Compiler/Architektur-spezifische Typen. Sie sprechen über den C++ - ISO-Standard, den ich noch nicht einmal erwähnt habe. – sharkin