例如,如果您要编写一个变体类型类,您自然需要识别该类的实例所承载的类型。我想知道是否有人知道人们可能感兴趣的所有原始数据类型的任何官方或半官方(事实上?)参考?
只有原语,不需要像string或handle这样的抽象类型。
谢谢。
例如,如果您要编写一个变体类型类,您自然需要识别该类的实例所承载的类型。我想知道是否有人知道人们可能感兴趣的所有原始数据类型的任何官方或半官方(事实上?)参考?
只有原语,不需要像string或handle这样的抽象类型。
谢谢。
唯一的官方参考是ISO/IEC 14882 C++ 标准。
谷歌搜索总是一个好的开始。在这里。现在,推出你的实际问题。
使用任何第三方变体。
您在标准中找不到的所有数据类型。
如果使用 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
}
请注意,如果您可以接受该值是动态分配的,则可以摆脱 max_size。如果您知道最大类型的大小,我只是想表明就地分配也有效。