-2

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

只有原语,不需要像stringhandle这样的抽象类型。

谢谢。

4

5 回答 5

4

您是否考虑过让另一个图书馆承担繁重的工作?

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

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

于 2009-03-06T09:53:15.180 回答
3

唯一的官方参考是ISO/IEC 14882 C++ 标准。

于 2009-03-06T09:38:05.543 回答
0

谷歌搜索总是一个好的开始。在这里。现在,推出你的实际问题。

于 2009-03-06T09:36:12.910 回答
0

使用任何第三方变体。

您在标准中找不到的所有数据类型。

于 2009-03-06T09:37:04.810 回答
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。如果您知道最大类型的大小,我只是想表明就地分配也有效。

于 2009-03-06T10:15:48.993 回答