2010-10-12 16 views
1

Est-il possible de faire le mappage Type -> Enum Series de compilation?C++ - type de mappage à enum

Illustrant avec un exemple:

Disons que j'ai quelques Type et une valeur dénombrée:

typedef int Type; 

enum Enumerated { Enum1, Enum2, Enum3, Enum4 }; 

et maintenant je déclare en quelque sorte ce qui suit: « Associons Enum1 et Enum4 avec le type Type(ne sait pas encore comment implémenter ceci)


Maintenant, je veux être en mesure de vérifier les points suivants (mieux à faire à l'aide mpl dans le temps de compilation):

Si sont effectivement mis en correspondance un certain type arbitraire et ENUM à l'autre:

template <typename ArbitraryType, Enumerated E> 
struct check_at_compile_time { 
    // Somehow tricky evaluate this 
    static const bool value; 
}; 

de sorte que les résultats sont les suivants:

check_at_compile_time<Type, Enum1>::value evaluates to TRUE 

check_at_compile_time<Type, Enum2>::value evaluates to FALSE 

check_at_compile_time<Type, Enum4>::value evaluates to TRUE 

check_at_compile_time<int, Enum3>::value evaluates to FALSE 

Si quelqu'un connaît une bonne façon de mettre en œuvre cela, s'il vous plaît aidez-moi. Peut-être quelque chose en utilisant boost::mpl, je ne suis pas sûr.

Merci.

Répondre

5

Vous pouvez le faire de cette façon, même sans boost.mpl:

template< Enumerated Value > struct Enumerated2Type { typedef void type; enum { value = false }; }; 
#define DEFINE_ENUMERATED_TYPE(TYPE, ENUM) template<> struct Enumerated2Type<ENUM> { typedef TYPE type; enum { value = true }; } 
DEFINE_ENUMERATED_TYPE(int, Enum1); 
DEFINE_ENUMERATED_TYPE(bool, Enum2); 
DEFINE_ENUMERATED_TYPE(double, Enum3); 
DEFINE_ENUMERATED_TYPE(std::string, Enum4); 

Et vous vérifiez que vous pouvez faire de cette façon:

template <typename ArbitraryType, Enumerated E> 
struct check_at_compile_time { 
    static bool const value = Enumerated2Type<E>::value && boost::is_same< ArbitraryType, typename Enumerated2Type<E>::type >::value; 
}; 

mais non testé devrait fonctionner comme ça.