2017-11-18 4 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は、整数型のみに基づくことができます。

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

この回答ありがとうございます。私の場合、タイプは 'std :: vector 'でなければなりません。私はおそらく静的メンバーと構造体を見てみましょう。 – Xatyrian

+1

@Xatyrian:XY問題のように聞こえるかもしれませんが、正確になぜそれが 'std :: vector 'になる必要があるのか​​を記述するべきでしょう。 –

+1

また、静的メンバーだけを持つ 'struct'はあまり意味がないので、名前空間を使用してください。 –

3

enumenum classは、任意のオブジェクトのインスタンスへのエイリアスとして意図されていない - 彼らがしています整数型に限定され、すべての明示的な値は定数式でなければなりません。詳細は、cppreference page on enumを参照してください。

あなたが使用する機能やinline変数のいずれか、std::vector<bool>の特定のインスタンスに名前を与えたい場合は:あなたの特定の使用の場合は

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

答えをありがとう。確かに、 'std :: bitset'も使えるかもしれませんが、以前はベクトルを使うことに決めましたので、今は本当に変更できません。列挙型を使用しないあなたのアプローチは面白いですが、異なる値をグループ化する必要があるので、構造体の静的メンバーにすると思います – Xatyrian

0

他、列挙できるだけで言ったように一体型である。

boolのベクトルの長さが一定の場合(例では、whereは2)、std::vector<bool>std::array<bool, length>に置き換えることができます。 std::vectorの代わりにstd::arrayを使用する利点の1つは、constexprと定義することができます。

だから合理(私見)代替案は、0から始まる連続した値と、

enum ProximityStateEnum : std::size_t 
{ 
    Unknown = 0U, 
    NotConnected, 
    Connected, 
    ConnectedButNotLatched 
}; 

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

staticconstexprstd::arraystd::size_tに基づいて、列挙型を定義しています

pseArr[NotConnected][0] 
関連する問題