Де-факто список примитивных типов, используемых в C ++ - PullRequest
0 голосов
/ 06 марта 2009

Если, например, вы собираетесь написать класс типов варианта, вам, естественно, понадобится определить, какой тип содержит экземпляр этого класса. Мне интересно, знает ли кто-нибудь какую-либо официальную или полуофициальную (де-факто?) Ссылку на все примитивные типы данных, которые могут быть интересны?

Только примитивы, и нет необходимости в абстрактных типах, таких как string или handle .

Спасибо.

Ответы [ 5 ]

4 голосов
/ 06 марта 2009

Рассматривали ли вы возможность позволить другой библиотеке выполнять тяжелую работу?

Есть Boost.Variant , который, вероятно, делает то, что вам нужно, полностью протестирован, безопасен и исправлен, и довольно эффективен.

Или, если вы хотите бросить свой собственный, используйте Boost.TypeTraits

3 голосов
/ 06 марта 2009

Единственным официальным указанием является ISO / IEC 14882 C ++.

0 голосов
/ 06 марта 2009

Вам не нужно ничего знать о типах, если вы используете 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, если вы можете принять, что значение динамически распределяется. Я просто хотел показать, что распределение по месту тоже работает, если вы знаете размер самого большого типа.

0 голосов
/ 06 марта 2009

Используйте любой сторонний вариант.

Все типы данных, которые вы не можете найти в стандарте.

0 голосов
/ 06 марта 2009

Поиск Google - это всегда хорошее начало. Здесь . Теперь разверните свой актуальный вопрос.

...