2009-03-06 4 views
-2

Si, par exemple, vous allez écrire une classe de type variant, vous aurez naturellement besoin d'identifier le type que porte une instance de cette classe. Je me demande si quelqu'un connaît une référence officielle ou semi-officielle (de facto?) De tous les types de données primitifs qui pourraient vous intéresser?Liste de fait des types primitifs utilisables en C++

Seules les primitives, et pas besoin de types abstraits comme chaîne ou gérer.

Merci.

Répondre

0

La recherche Google est toujours un bon début. Here. Maintenant, déployez votre vraie question.

+1

Oui, dirigez tout le monde vers la recherche Google au lieu de poser des questions sur StackOVerflow. Peut-être que vous avez manqué l'idée de pourquoi nous voulons SO et non Google Search, Google Groupes ou quelque chose comme ça. Quoi qu'il en soit, votre lien n'est pas très bon de toute façon, ne peut pas trouver longlong ou int64, donc je ne fais pas confiance à la liste. -1 – sharkin

+0

longlong et int64 ne sont pas définis en C++. -1 vous-même – jalf

+0

Ce sont des types spécifiques au compilateur/à l'architecture. Vous parlez de la norme ISO C++ que je n'ai même pas mentionnée. – sharkin

0

Utilisez n'importe quel variante tierce.

Tous les types de données que vous ne trouvez pas dans la norme.

4

Avez-vous envisagé de laisser une autre bibliothèque soulever des charges lourdes?

Il y a Boost.Variant qui fait probablement ce dont vous avez besoin, entièrement testé, sûr et correct, et très efficace.

Ou si vous voulez rouler votre propre, utilisez Boost.TypeTraits

+0

Merci pour le conseil, mais ceci est une expérience d'apprentissage. – sharkin

0

Vous n'avez pas besoin de savoir quoi que ce soit sur les types si vous utilisez 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 
} 

Notez que vous pouvez vous débarrasser de max_size, Si vous pouvez accepter que la valeur est allouée dynamiquement. Je voulais juste montrer que l'allocation de place fonctionne aussi, si vous connaissez la taille du plus grand type.

Questions connexes