gpt4 book ai didi

c++ - 如何使枚举类与 'bit-or' 功能一起使用?

转载 作者:可可西里 更新时间:2023-11-01 16:30:10 24 4
gpt4 key购买 nike

我通常将 enum 与“位或”或 | 一起使用,以允许对象具有一些选项。如何使枚举类使用“位或”功能?

最佳答案

您需要为您的枚举类重载运算符并通过转换为基础类型来实现它们:

enum class foo : unsigned {
bar = 1,
baz = 2
};

foo operator |(foo a, foo b) {
return static_cast<foo>(static_cast<unsigned>(a) | static_cast<unsigned>(b));
}

…当然这可以推广(使用 SFINAE 和 std::underlying_type )。在我看来,C++ 没有提供开箱即用的功能是一种疏忽。

这是一般的实现方式:

// Intentionally undefined for non-enum types.
template <typename T, bool = std::is_enum<T>::value>
struct is_flag;

template <typename T>
struct is_flag<T, true> : std::false_type { };

template <typename T, typename std::enable_if<is_flag<T>::value>::type* = nullptr>
T operator |(T lhs, T rhs) {
using u_t = typename std::underlying_type<T>::type;
return static_cast<T>(static_cast<u_t>(lhs) | static_cast<u_t>(rhs));
}

// … same for `&`, `~`. And maybe functions like `isset`, `set` and `unset`.

此实现确保仅针对实际充当标志的枚举找到重载。要将枚举标记为标志,您需要特化 is_flag:

enum class a_flag : unsigned {
foo = 0,
bar = 1,
baz = 2
};

template <> struct is_flag<a_flag> : std::true_type { };

关于c++ - 如何使枚举类与 'bit-or' 功能一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18803940/

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