2013-07-24 45 views
1

我是编程语言的新手,有什么方法可以在运行时在一个变量中存储不同的数据类型。 EX:有没有什么办法可以在运行时在一个变量中存储不同的数据类型

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

你可以使用工会(但你需要跟踪你存储的是什么类型) –

+1

工会或void *,但强烈依赖于你需要做什么。 – user2553780

+1

为什么没有模板?你究竟在做什么? – OmnipotentEntity

回答

7

没有为这种使用情况没有内置的C++解决方案。但是有一些库构建在C/C++之上,它们提供了这种类型的功能。

+0

将libcello作为'C'的可行解决方案? – tay10r

+0

@TaylorFlores我不熟悉libcello。我快速浏览了一下,看起来它会是 – JaredPar

+0

是的,还有一个[link](http://libcello.org/)用于'C'不会伤害 – tay10r

0

那么没有这样的事情存在完全相同为此,在C++中,但你可以使用union。它可以达到目的。你也可以尝试一些第三方库。

3

有几种方法可以做到这一点。 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 *指针和做铸造,但这不推荐。

+1

我喜欢你的答案... + 1 – spartygw

0

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

如果你知道变量可以容纳的所有不同类型,那么联合看起来就像是一个合适的工具。

相关问题