Yip*_*Yay 2 c++ enums templates types boost-mpl
有可能进行编译时Type -> Enum Series映射吗?
举例说明:
比方说,我有一些Type枚举值:
typedef int Type;
enum Enumerated { Enum1, Enum2, Enum3, Enum4 };
Run Code Online (Sandbox Code Playgroud)
现在我以某种方式陈述以下内容:"让我们关联Enum1并Enum4
与类型Type (不知道如何实现这一点).
现在我希望能够检查以下内容(最好在编译时使用mpl完成):
如果某些任意类型和枚举实际上彼此映射:
template <typename ArbitraryType, Enumerated E>
struct check_at_compile_time {
// Somehow tricky evaluate this
static const bool value;
};
Run Code Online (Sandbox Code Playgroud)
以便结果如下:
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
Run Code Online (Sandbox Code Playgroud)
如果有人知道实现这个的好方法,请帮助我.也许使用的东西boost::mpl,我不确定.
谢谢.
即使没有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);
Run Code Online (Sandbox Code Playgroud)
你检查你可以这样做:
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;
};
Run Code Online (Sandbox Code Playgroud)
未经测试但应该像这样工作.