2017-11-18 205 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] 
相關問題