2013-07-24 42 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.

如果你知道變量可以容納的所有不同類型,那麼聯合看起來就像是一個合適的工具。

相關問題