2009-03-06 31 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的,如果您可以接受该值是动态分配的。如果你知道最大类型的大小,我只是想表明,就地分配工作也是如此。

相关问题