1

我是编程语言的新手,有没有办法在运行时将不同的数据类型存储在一个变量中。前任:

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?
}

如果我在不使用模板的情况下获得解决方案,那将有很大帮助

4

4 回答 4

7

此用例没有内置的 C++ 解决方案。然而,有一些建立在 C/C++ 之上的库提供了这种类型的功能。

于 2013-07-24T16:18:59.557 回答
3

有几种方法可以做到这一点。联合允许您将多种不同类型的数据存储在同一内存位置,但使用的空间将是最大数据类型所需的空间,并且您在添加或删除它时必须知道类型:

// 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* 指针并进行强制转换,但不建议这样做。

于 2013-07-24T16:30:18.017 回答
0

好吧,在 C++ 中不存在完全用于此目的的东西,但您可以使用union. 它可以达到目的。您也可以尝试一些第三方库。

于 2013-07-24T16:20:59.147 回答
0

您可以使用 void* 来保存不同类型的值,但您将失去强类型语言的所有好处。Cello ( http://libcello.org/ ) 使用这种方法在 C 中实现了鸭子类型的一个版本。

如果您知道变量可以包含的所有不同类型,那么联合似乎是完成这项工作的合适工具。

于 2013-07-24T16:33:21.093 回答