我是编程语言的新手,有没有办法在运行时将不同的数据类型存储在一个变量中。前任:
class a
{
void b(anydatatype var)
int ab;
}
void a::b(anydatatype var)
{
ab = var;
//how can i make this possible to assign any data type to that int?
}
如果我在不使用模板的情况下获得解决方案,那将有很大帮助
此用例没有内置的 C++ 解决方案。然而,有一些建立在 C/C++ 之上的库提供了这种类型的功能。
有几种方法可以做到这一点。联合允许您将多种不同类型的数据存储在同一内存位置,但使用的空间将是最大数据类型所需的空间,并且您在添加或删除它时必须知道类型:
// 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 变体围绕变体的概念提供了一个很好的面向对象的包装器,并允许您包含非 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* 指针并进行强制转换,但不建议这样做。
好吧,在 C++ 中不存在完全用于此目的的东西,但您可以使用union
. 它可以达到目的。您也可以尝试一些第三方库。
您可以使用 void* 来保存不同类型的值,但您将失去强类型语言的所有好处。Cello ( http://libcello.org/ ) 使用这种方法在 C 中实现了鸭子类型的一个版本。
如果您知道变量可以包含的所有不同类型,那么联合似乎是完成这项工作的合适工具。