Фактический список примитивных типов, используемых в C++.

StackOverflow https://stackoverflow.com/questions/618204

Вопрос

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

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

Спасибо.

Это было полезно?

Решение

Единственный чиновник ссылка - это ИСО/МЭК 14882 Стандарт С++.

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top