2017-11-18 89 views
2

我想要使用枚举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。我该如何创建一个向量枚举?

回答

4

你不能; 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 
}; 
+0

感谢您的回答。在我的情况下,我真的需要这种类型是'std :: vector '。我可能会看看结构与静态成员。 – Xatyrian

+1

@Xatyrian:听起来像一个XY问题,你应该描述为什么你需要它是一个'std :: vector '。 –

+1

此外,只有静态成员的'struct'没有多大意义,请使用名称空间。 –

3

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

感谢您的回答。事实上,'std :: bitset'也可以使用,但我之前决定坚持使用矢量,所以现在我不能真正改变。没有枚举的你的方法很有趣,但是因为我需要将不同的值分组,所以我想让它们成为结构体的静态成员 – Xatyrian

0

至于说其他,枚举只能是整体类型。

如果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一个staticconstexprstd::arraybool

// .......................... 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]