2010-10-12 192 views
1

是否可以使彙編時間Type -> Enum Series映射?C++ - 映射類型枚舉

用一個例子舉例說明:

比方說,我有一些Type和枚舉值:

typedef int Type; 

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

,現在我莫名其妙聲明如下:「讓我們與類型相關聯Enum1Enum4 Type(不知道如何實現這個)


現在,我希望能夠檢查以下(最好使用在編譯時MPL完成):

如果一些任意類型和枚舉實際上是被映射到對方:

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

使結果如下:

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 

如果有人知道一個很好的方法來實現這一點,請幫助我。也許使用boost::mpl,我不確定。

謝謝。

回答

5

你甚至可以這樣來做,而不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); 

你檢查,你可以做到這一點的方法:

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; 
}; 

未經測試,但應該像這樣工作。