有几种方法可以做到这一点。 A union可让您在同一内存位置存储多种不同类型的数据,但使用的空间将是最大数据类型所需的空间,并且在添加或删除它时必须知道该类型:
// This will take 8 bytes because a long is int64_t is 8 bytes
union MyUnion {
int32_t regular_int;
int64_t big_int;
}
MyUnion var;
// Stores an int32_t in var
var.regular_int = 100;
// replaces it wiht an int64_t
var.big_int = 100;
Boost variant围绕变体的想法提供了一个很好的面向对象的包装,并允许包含非POD类型。
您也可以创建自己的一组类,使您可以执行此操作并提供对您的应用程序有用的功能。例如,如果你需要能够写所有的值类型到标准输出下面可能是有用的:
class MyVariant {
public:
virtual void print() = 0;
}
template<class T> MyVariantType public MyVariant {
private:
private T data_;
public:
MyVariantType(T data) {
data_ = data;
}
virtual void print() {
cout << data_;
}
}
MyVariant* var = new MyVariantType<int>(100);
var->print();
var = new MyVariantType<string>("hello world");
var->print();
最后,如果你真的绝望了,你可以用void *指针和做铸造,但这不推荐。
你可以使用工会(但你需要跟踪你存储的是什么类型) –
工会或void *,但强烈依赖于你需要做什么。 – user2553780
为什么没有模板?你究竟在做什么? – OmnipotentEntity