Фактический список примитивных типов, используемых в C++.
-
03-07-2019 - |
Вопрос
Если, например, вы собираетесь написать класс вариантного типа, вам, естественно, потребуется определить, какой тип несет экземпляр этого класса.Мне интересно, знает ли кто-нибудь какую-либо официальную или полуофициальную (де-факто?) ссылку на все примитивные типы данных, которые могут быть интересны?
Только примитивы, и нет необходимости в абстрактных типах, таких как нить или ручка.
Спасибо.
Решение
Единственный чиновник ссылка - это ИСО/МЭК 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, если согласны с тем, что значение выделяется динамически.Я просто хотел показать, что распределение по местам тоже работает, если вы знаете размер самого большого типа.