创建一个std :: vector的枚举

时间:2017-11-18 12:21:46

标签: c++ c++11 enums

我正在尝试使用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。如何创建矢量枚举?

3 个答案:

答案 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)

enumenum 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} } } };