Vous n'avez pas besoin de savoir quoi que ce soit sur les types si vous utilisez 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
}
Notez que vous pouvez vous débarrasser de max_size, Si vous pouvez accepter que la valeur est allouée dynamiquement. Je voulais juste montrer que l'allocation de place fonctionne aussi, si vous connaissez la taille du plus grand type.
Oui, dirigez tout le monde vers la recherche Google au lieu de poser des questions sur StackOVerflow. Peut-être que vous avez manqué l'idée de pourquoi nous voulons SO et non Google Search, Google Groupes ou quelque chose comme ça. Quoi qu'il en soit, votre lien n'est pas très bon de toute façon, ne peut pas trouver longlong ou int64, donc je ne fais pas confiance à la liste. -1 – sharkin
longlong et int64 ne sont pas définis en C++. -1 vous-même – jalf
Ce sont des types spécifiques au compilateur/à l'architecture. Vous parlez de la norme ISO C++ que je n'ai même pas mentionnée. – sharkin