该代码片段用于记录多个摄像头的状态。我为上述范围枚举重载了几个位运算符。 下面的代码片段运行良好。
虽然我清楚地知道根本不会有溢出问题,但我还是担心
MODULE_ENABLED::MODULE_ENABLED_FRONT_CAMERA|MODULE_ENABLED::MODULE_ENABLED_MIDDLE_CAMERA
的表达
作为所述表达式的结果不是
enum class MODULE_ENABLED
的有效值。背后是否有什么潜在的问题?
我已仔细阅读SO和SE上发布的相关问题,但他们没有明确回答我的问题。
#include <iostream>
#include <stdint.h>
enum class MODULE_ENABLED : uint8_t
{
MODULE_ENABLED_NONE = 0,
MODULE_ENABLED_FRONT_CAMERA = 1,
MODULE_ENABLED_MIDDLE_CAMERA = 2,
MODULE_ENABLED_BACK_CAMERA = 4,
};
MODULE_ENABLED operator|(const MODULE_ENABLED& a, const MODULE_ENABLED& b);
MODULE_ENABLED& operator|=(MODULE_ENABLED& a, const MODULE_ENABLED& b);
MODULE_ENABLED operator&(const MODULE_ENABLED& a, const MODULE_ENABLED& b);
MODULE_ENABLED operator&=(MODULE_ENABLED& a, const MODULE_ENABLED& b);
MODULE_ENABLED operator^(const MODULE_ENABLED& a, const MODULE_ENABLED& b);
MODULE_ENABLED& operator^=(MODULE_ENABLED& a, const MODULE_ENABLED& b);
MODULE_ENABLED operator~(const MODULE_ENABLED& a);
MODULE_ENABLED operator|(const MODULE_ENABLED& a, const MODULE_ENABLED& b)
{
using MODULE_ENABLED = MODULE_ENABLED;
return static_cast<MODULE_ENABLED>(static_cast<std::underlying_type<MODULE_ENABLED>::type>(a) | static_cast<std::underlying_type<MODULE_ENABLED>::type>(b));
}
MODULE_ENABLED& operator|=(MODULE_ENABLED& a, const MODULE_ENABLED& b)
{
a=(a|b);
return a;
}
MODULE_ENABLED operator&(const MODULE_ENABLED& a, const MODULE_ENABLED& b)
{
using MODULE_ENABLED = MODULE_ENABLED;
return static_cast<MODULE_ENABLED>(static_cast<std::underlying_type<MODULE_ENABLED>::type>(a) & static_cast<std::underlying_type<MODULE_ENABLED>::type>(b));
}
MODULE_ENABLED operator&=(MODULE_ENABLED& a, const MODULE_ENABLED& b)
{
a = a&b;
return a;
}
MODULE_ENABLED operator^(const MODULE_ENABLED& a, const MODULE_ENABLED& b)
{
using MODULE_ENABLED = MODULE_ENABLED;
return static_cast<MODULE_ENABLED>(static_cast<std::underlying_type<MODULE_ENABLED>::type>(a) ^ static_cast<std::underlying_type<MODULE_ENABLED>::type>(b));
}
MODULE_ENABLED& operator^=(MODULE_ENABLED& a, const MODULE_ENABLED& b)
{
a = a ^ b;
return a;
}
MODULE_ENABLED operator~(const MODULE_ENABLED& a)
{
using MODULE_ENABLED = MODULE_ENABLED;
return static_cast<MODULE_ENABLED>(~static_cast<std::underlying_type<MODULE_ENABLED>::type>(a));
}
int main() {
MODULE_ENABLED status = MODULE_ENABLED::MODULE_ENABLED_FRONT_CAMERA|MODULE_ENABLED::MODULE_ENABLED_MIDDLE_CAMERA;
std::cout << std::hex << static_cast<int>(status) << std::endl;
return 0;
}
由于上述表达式的结果不是枚举类 MODULE_ENABLED 的有效值
这不是真的,因为不仅仅是命名枚举才是有效值。您确实可以像您一样将位标志组合在一起...这是常见且安全的用法。