Elenco di fatto dei tipi primitivi utilizzabili in C ++
-
03-07-2019 - |
Domanda
Se, ad esempio, stai per scrivere una classe di tipo variante, dovrai naturalmente identificare il tipo che trasporta un'istanza di quella classe. Mi chiedo se qualcuno sia a conoscenza di riferimenti ufficiali o semi-ufficiali (di fatto?) A tutti i tipi di dati primitivi che potrebbero interessare?
Solo primitive e nessuna necessità di tipi astratti come string o handle .
Grazie.
Soluzione
L'unico riferimento ufficiale è ISO / IEC 14882 Standard C ++.
Altri suggerimenti
Hai pensato di lasciare che un'altra biblioteca esegua il lavoro pesante?
C'è Boost.Variant che probabilmente lo fa ciò di cui hai bisogno, completamente testato, dattiloscritto e corretto e abbastanza efficiente.
Oppure, se vuoi creare il tuo, usa Boost.TypeTraits
Ricerca Google è sempre un buon inizio. Qui . Ora lancia la tua vera domanda.
Utilizza qualsiasi variante di terze parti.
Tutti i tipi di dati che puoi trovare in standard.
Non devi sapere nulla sui tipi se usi 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
}
Nota che puoi eliminare max_size, se puoi accettare che il valore sia allocato dinamicamente. Volevo solo dimostrare che anche l'allocazione sul posto funziona, se conosci la dimensione del tipo più grande.