创建一个std :: vector的枚举
我想要使用枚举std::vector<bool>
,因为我想将某些值表示为一个位向量。创建一个std :: vector的枚举
所以,我想下面的代码:
enum class ProximityStateEnum : std::vector<bool> {
Unknown = std::vector<bool>{false,false},
NotConnected = std::vector<bool>{false,true},
Connected = std::vector<bool>{true,false},
ConnectedButNotLatched = std::vector<bool>{true,true}
};
但是,当我与此编译代码,我得到的错误underlying type ‘std::vector<bool>’ of ‘ProximityStateEnum’ must be an integral type
。我该如何创建一个向量枚举?
你不能; enum
s只能基于整型。
如果它可以是有帮助的,因为C++ 14可以使用二进制文字指定它们的值:
enum class ProximityStateEnum {
Unknown = 0b00,
NotConnected = 0b01,
Connected = 0b10,
ConnectedButNotLatched = 0b11
};
这是相当多的你的想法是明确的,但方式更加紧凑和数量级比任何假设的基于std::vector
的解决方案更高效。
,往往是在enum
S其中特定位具有特定的含义使用另一种可能性是用表情来构建它们:
enum ProximityStateEnum {
Unknown = 0b00,
NotConnected = 0b01,
Connected = 0b10,
ConnectedButNotLatched = Connected | NotConnected
};
enum
和enum class
并不意味着作为别名任意对象的实例 - 他们限于整数类型,并且每个显式值必须是的常数表达式。有关更多信息,请参阅cppreference page on enum
。
如果你想给一个名称的std::vector<bool>
特定的情况下,无论是使用功能或inline
变量:
auto Unknown() { return std::vector<bool>{false,false}; }
auto NotConnected() { return std::vector<bool>{false,true}; }
auto Connected() { return std::vector<bool>{true,false}; }
auto ConnectedButNotLatched() { return std::vector<bool>{true,true}; }
// ...or, in C++17:
inline auto Unknown = std::vector<bool>{false,false};
inline auto NotConnected = std::vector<bool>{false,true};
inline auto Connected = std::vector<bool>{true,false};
inline auto ConnectedButNotLatched = std::vector<bool>{true,true};
在您的特定用途的情况下,你并不真的需要一个std::vector
因为你知道大小提前确定您的bitset的 - std::bitset
或二进制文字将工作做好:
enum class ProximityStateEnum : /* some suitable type */
{
Unknown = 0b00,
NotConnected = 0b01,
Connected = 0b10,
ConnectedButNotLatched = 0b11
};
感谢您的回答。事实上,'std :: bitset'也可以使用,但我之前决定坚持使用矢量,所以现在我不能真正改变。没有枚举的你的方法很有趣,但是因为我需要将不同的值分组,所以我想让它们成为结构体的静态成员 – Xatyrian
至于说其他,枚举只能是整体类型。
如果bool向量的长度恒定(例如,其中是2),则可以使用std::array<bool, length>
替代std::vector<bool>
。使用std::array
而不是std::vector
的一个优点是您可以将其定义为constexpr
。
因此,一个合理的(IMHO)另一种方法是定义基于std::size_t
一个枚举类型,与来自0
开始顺序值,
enum ProximityStateEnum : std::size_t
{
Unknown = 0U,
NotConnected,
Connected,
ConnectedButNotLatched
};
和std::arrays
一个static
constexpr
std::array
的bool
// .......................... last value of the enum vvvvvvvvvvvvvvvvvvvvvv
static constexpr std::array<std::array<bool, 2U>, 1U+ConnectedButNotLatched>
pseArr { { { {false, false} }, { {false, true} },
{ {true, false} }, { {true, true} } } };
你可以使用如下
pseArr[NotConnected][0]
感谢您的回答。在我的情况下,我真的需要这种类型是'std :: vector'。我可能会看看结构与静态成员。 –
Xatyrian
@Xatyrian:听起来像一个XY问题,你应该描述为什么你需要它是一个'std :: vector'。 –
此外,只有静态成员的'struct'没有多大意义,请使用名称空间。 –