我正在尝试使用std::vector<bool>
的枚举,因为我想将某些值表示为位向量。
所以我尝试了以下代码:
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
。如何创建矢量枚举?
答案 0 :(得分:4)
你不能; enum
只能基于整数类型。
如果它有用,那么从C ++ 14开始,您可以使用二进制文字来指定它们的值:
enum class ProximityStateEnum {
Unknown = 0b00,
NotConnected = 0b01,
Connected = 0b10,
ConnectedButNotLatched = 0b11
};
这几乎与您的想法一样清晰,但比任何假设的基于std::vector
的解决方案更加紧凑,数量级更高效。
enum
中经常使用的特定位具有特定含义的另一种可能性是使用表达式构建它们:
enum ProximityStateEnum {
Unknown = 0b00,
NotConnected = 0b01,
Connected = 0b10,
ConnectedButNotLatched = Connected | NotConnected
};
答案 1 :(得分:3)
enum
和enum class
并不是任意对象实例的别名 - 它们仅限于整数类型,每个显式值必须为< em>常量表达式。有关详细信息,请参阅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
,因为您事先知道了您的位集的大小 - std::bitset
或二进制文字工作得很好:
enum class ProximityStateEnum : /* some suitable type */
{
Unknown = 0b00,
NotConnected = 0b01,
Connected = 0b10,
ConnectedButNotLatched = 0b11
};
答案 2 :(得分:0)
正如其他人所说,枚举只能是整体类型。
如果你的bool向量的长度是常数(如你所示,在2中),你可以用std::vector<bool>
代替std::array<bool, length>
。使用std::array
代替std::vector
的一个好处是您可以将其定义为constexpr
。
所以合理的(IMHO)替代方案是定义基于std::size_t
的枚举类型,顺序值从0
开始,
enum ProximityStateEnum : std::size_t
{
Unknown = 0U,
NotConnected,
Connected,
ConnectedButNotLatched
};
以及static
constexpr
的{{1}} std::array
std::arrays
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} } } };