3

Existe-t-il un moyen de mapper des valeurs enum à des types en C++, y compris C++ 11.
J'ai le type ENUM suivant:Mappage d'une valeur enum à un type en C++

enum ATTRIBUTE{AGE=0, MENOPAUSE, TUMOR_SIZE, INV_NODES, NODE_CAPS, 
       DEG_MALIG, BREAST, BREAST_QUAD, IRRADIAT, CLASS}; 

Je veux associer chaque valeur de cette ENUM à un certain type. Je veux mapper AGE à int, MENOPAUSE à un autre type enum, BREAST à bool et ainsi de suite.
Donc est-il possible de créer une fonction qui renvoie une valeur de type qui dépend de la valeur de la variable attr?

//Like that: 
auto value = map_attr(ATTRIBUTE attr); 
//Here the type of the value variable should be int if the attr variable is AGE, bool for BREAST and so on. 
+3

Je sens un (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) [XY problème]. Qu'est-ce que vous essayez de résoudre avec ça? – StoryTeller

+1

Essayez 'boost :: mpl :: map' – Nim

+2

Cette réponse se fait dans l'autre sens: http://stackoverflow.com/questions/4995378/c-template-for-mapping-struct-type-to-enum – Nim

Répondre

8

Une façon idiomatiques de le faire utilise des traits:

enum ATTRIBUTE{ AGE=0, MENOPAUSE, TUMOR_SIZE, INV_NODES, NODE_CAPS, DEG_MALIG, BREAST, BREAST_QUAD, IRRADIAT, CLASS }; 

template<ATTRIBUTE> struct Map; 

template<> struct Map<AGE> { 
    using type = int; 
    static constexpr type value = 42; 
}; 

template<> struct Map<MENOPAUSE> { 
    using type = AnotherEnumType; 
    static constexpr type value = AnotherEnumType::AnotherEnumValue; 
}; 

// ... 

Ensuite, vous pouvez définir map_attr comme modèle de fonction:

template<ATTRIBUTE A> 
typename Map<A>::type map_attr() { return Map<A>::value; } 

et l'utiliser comme:

auto something = map_attr<AGE>(); 

Il suit un exemple minimal, travail:

#include<type_traits> 

enum ATTRIBUTE{ AGE=0, MENOPAUSE }; 

template<ATTRIBUTE> struct Map; 

template<> struct Map<AGE> { 
    using type = int; 
    static constexpr type value = 42; 
}; 

template<> struct Map<MENOPAUSE> { 
    using type = double; 
    static constexpr type value = 0.; 
}; 

template<ATTRIBUTE A> 
typename Map<A>::type map_attr() { return Map<A>::value; } 

int main() { 
    static_assert(std::is_same<decltype(map_attr<AGE>()), int>::value, "!"); 
    static_assert(std::is_same<decltype(map_attr<MENOPAUSE>()), double>::value, "!"); 
} 
+0

Existe-t-il un moyen d'utiliser dynamiquement map_attr, c'est-à-dire map_attr () 'où' getAttribute() 'renvoie un attribut ATTRIBUTE? – maga

+1

Cela fonctionnerait tant que 'getAttribute' est une fonction' constexpr' probablement. Oui. – skypjack