2010-10-12 193 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; 
}; 

未经测试,但应该像这样工作。