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的值内.
我查看了各种枚举相关的问题,比如如何迭代枚举,似乎无法完成.
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)
如果不以元编程形式重新声明所有信息,这是不可能完成的。但是,您可以这样做:
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的功能,尽管实际语法可能有点偏离。
| 归档时间: |
|
| 查看次数: |
1540 次 |
| 最近记录: |