gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:26 25 4
gpt4 key购买 nike

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

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!

在那里使用第二个模板非类型 bool 参数会很有用,该 bool 值的值将由元函数给出,给定的值将验证该值是否在 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

如果您真的非常想避免重复(并且对使用某些外部工具生成源代码不感兴趣),您可以求助于 macro 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

关于C++11 元编程 - 在编译期间查找枚举值(值包含间隙),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11162525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com