C++ 11元编程 - 在编译期间查找枚举值(值包含间隙)

emi*_*rax 6 c++ enums metaprogramming c++11

在编译时,是否有办法验证给定值是否在给定枚举的值内,因此有效?

enum myenum { val1 = 10, val2 = 30, val3 = 45 }

template <myenum t>
class myClass
{ ... }

myClass<10> a; // fails, OK
myClass<val1> b; // compiles OK
myClass<myenum(24)> c; //compiles, NOT OK!
Run Code Online (Sandbox Code Playgroud)

使用第二个模板非类型布尔参数在那里是有用的,并且该布尔值将由元函数给出,给定值将验证该值是否在myenum的值内.

我查看了各种枚举相关的问题,比如如何迭代枚举,似乎无法完成.

bam*_*s53 5

enum myenum { val1 = 10, val2 = 30, val3 = 45 };
template<myenum e> struct is_valid_myenum { static const bool value = (e==val1 || e==val2 || e==val3); };

template<myenum t>
class myClass
{
    static_assert(is_valid_myenum<t>::value, "t must be a valid enum value");
};

myClass<10> a; // fails, OK
myClass<val1> b; // compiles OK
myClass<myenum(24)> c; // fails, OK
Run Code Online (Sandbox Code Playgroud)

如果你真的,真的想避免重复(并且不想使用一些外部工具来生成源代码),你可以诉诸宏hackery.

#define LIST \
    ITEM(val1,10)\
    ITEM(val2,30)\
    ITEM(val3,45)

#define ITEM(NAME,VALUE) NAME = VALUE,

enum myenum { LIST };

#undef ITEM

#define ITEM(NAME,VALUE) e==NAME ||

template<myenum e> struct is_valid_myenum { static const bool value = ( LIST false ); };

template<myenum t>
class myClass
{
    static_assert(is_valid_myenum<t>::value, "t must be a valid enum value");
};

myClass<10> a; // fails, OK
myClass<val1> b; // compiles OK
myClass<myenum(24)> c; // fails, OK
Run Code Online (Sandbox Code Playgroud)


K-b*_*llo 0

如果不以元编程形式重新声明所有信息,这是不可能完成的。但是,您可以这样做:

enum myenum { val1 = 10, val2 = 30, val3 = 45 };
typedef vector_c< myenum, val1, val2, val3 > typed_myenum;

typedef
    contains< typed_myenum, integral_c< myenum, val >::value
    val_found;
Run Code Online (Sandbox Code Playgroud)

使用Boost.MPL的功能,尽管实际语法可能有点偏离。