事实上在C ++中可用的基本类型列表

时间:2009-03-06 09:32:33

标签: c++ reference types variant primitive-types

例如,如果您要编写变体类型类,您自然需要识别该类的实例所携带的类型。我想知道是否有人知道任何可能感兴趣的所有原始数据类型的官方或半官方(事实上?)参考?

只有原语,不需要抽象类型,如 string handle

感谢。

5 个答案:

答案 0 :(得分:4)

您是否考虑让另一个图书馆进行繁重的工作?

Boost.Variant可能会满足您的需求,经过全面测试,类型安全且正确,而且非常高效。

或者,如果您想自己动手,请使用Boost.TypeTraits

答案 1 :(得分:3)

唯一官方引用是ISO/IEC 14882 C ++标准。

答案 2 :(得分:0)

Google搜索始终是一个良好的开端。 Here。现在,推出你的实际问题。

答案 3 :(得分:0)

使用任何第三方变体。

您可以在标准中找到所有数据类型。

答案 4 :(得分: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。如果您知道最大类型的大小,我只是想表明分配工作也是如此。