gpt4 book ai didi

c++ - 检查枚举类是否包含特定标识符

转载 作者:行者123 更新时间:2023-12-04 11:25:43 28 4
gpt4 key购买 nike

我在 SO 上搜索了一下,但很惊讶我没有找到任何类似的问题。如果这已经得到回答,很高兴有任何提示。
我有一个定义了很多枚举类的代码库。其中一些指定了 totalNum 常量,例如

enum class Foo : int
{
a,
b,
c,

totalNum
}
其他人没有这样的
enum class Bar : bool
{
oneOption,
otherOption
}
然后我有一个基本上像这样的功能
template <class EnumClassType>
EnumClassType typeToEnum (typename std::underlying_type<EnumClassType>::type value)
{
// If you hit this assertion, the value is outside of the valid enum range
assert (isPositiveAndBelow (value, decltype (value) (EnumClassType::totalNum)));

return EnumClassType (value);
}
虽然这对带有 totalNum 的枚举有效并且有意义指定,如果枚举中没有这样的标识符,我想跳过这个断言。有没有办法做到这一点?代码库目前使用 C++ 14,但由于即将进行的编译器更改,也欢迎使用 C++ 17 解决方案。

最佳答案

同时使用评论中提到的@jfh 之类的方法自己找到了答案。
首先,这是一种检查枚举类是否包含具有特定名称的标识符的方法

template <class EnumToTest>
class EnumConstantDefined_totalNum
{
private:
using Yes = int8_t;
using No = int16_t;

template <class E>
static Yes test (decltype (E::totalNum)*);

template <class E>
static No test (...);

public:
static constexpr bool value = sizeof (test<EnumToTest> (0)) == sizeof (Yes);
};

然后我们可以使用 SFINAE 为这两种枚举指定两个重载。
template <class EnumType>
std::enable_if_t<EnumConstantDefined_totalNum<EnumType>::value, void> assertValueIsInRange (typename std::underlying_type<EnumType>::type value)
{
assert (isPositiveAndBelow (value, decltype (value) (EnumType::totalNum)));
}

template <class EnumType>
std::enable_if_t<! EnumConstantDefined_totalNum<EnumType>::value, void> assertValueIsInRange (typename std::underlying_type<EnumType>::type)
{
// do nothing
}

然后在实际的转换函数中使用这个断言函数
/**
Casts a value matching an enum class underlying type to an enum class constant and asserts that the
value is inside the valid enum range
*/
template <class EnumClassType>
EnumClassType typeToEnum (typename std::underlying_type<EnumClassType>::type value)
{
assertValueIsInRange<EnumClassType> (value);

return EnumClassType (value);
}

关于c++ - 检查枚举类是否包含特定标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68472428/

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