2009-03-06 15 views
-2

例如,如果您要編寫變體類型類,那麼您自然需要標識該類的實例正在攜帶什麼類型。我想知道是否有人知道任何可能感興趣的所有原始數據類型的官方或半官方(事實上?)引用?在C++中可用的基本類型的實際列表

只有原語和沒有必要的抽象類型,如手柄

謝謝。

回答

0

谷歌搜索總是一個好的開始。 Here。現在,推出您的實際問題。

+1

是的,每個人都可以直接到谷歌搜索,而不是在StackOVerflow上提問。也許你錯過了我們爲什麼要這麼做而不是谷歌搜索,Google網上論壇或類似的東西的想法。無論如何,你的鏈接不太好,無法找到longlong或int64,所以我不信任這個列表。 -1 – sharkin 2009-03-06 09:45:36

+0

longlong和int64在C++中沒有定義。 -1你自己 – jalf 2009-03-06 09:50:52

0

使用任何第三方變體。

所有你不能在標準中找到的數據類型。

4

你是否考慮讓另一個圖書館完成繁重的工作?

Boost.Variant可能做你需要的,經過充分測試,類型安全和正確,並且非常有效。

或者,如果你想推出自己的,使用Boost.TypeTraits

0

你並不需要,如果你使用的typeid瞭解什麼類型:

#include <typeinfo> 
#include <iostream> 

using namespace std; 

struct var_base 
{ 
    const type_info & t; 
    var_base(const type_info & t) : t(t) {}; 

    virtual ~var_base() {}; 
}; 

template<class T> struct var : var_base 
{ 
    T value; 

    var(T x) : var_base(typeid(T)), value(x) {}; 
}; 

struct variant { 
    const static int max_size=16; 

    char data[max_size]; 
    var_base & v; 

    variant() : v(*(var_base*)data) { 
     new (data) var<int>(0); 
    } 

    const type_info & getType() { return v.t; } 

    template<class T> T & get() { 
     assert(getType()==typeid(T)); 
     return static_cast< var<T> &>(v).value; 
    } 

    template<class T> void set(const T & value) { 
      // Compile time assert is also possible here. 
     assert(sizeof(var<T>)<=max_size); 
     v.~var_base(); 
     new (data) var<T>(value); 
    } 
}; 

main() 
{ 
    variant v; 
    v.set<float>(1.2); 
    cout << v.getType().name() << endl; 
    cout << v.get<float>(); 
    cout << v.get<int>(); // Assert fails 
} 

請注意,您可以擺脫MAX_SIZE的,如果您可以接受該值是動態分配的。如果你知道最大類型的大小,我只是想表明,就地分配工作也是如此。

相關問題