C++ 创建std::vector的枚举

C++ 创建std::vector的枚举,c++,c++11,enums,C++,C++11,Enums,我试图使用std::vector的枚举,因为我希望将一些值表示为位向量 因此,我尝试了以下代码: enum class ProximityStateEnum : std::vector<bool> { Unknown = std::vector<bool>{false,false}, NotConnected = std::vector<bool>{false,true}, Connected = std::vector<b

我试图使用
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}

};
枚举类ProximityStateEnum:std::vector{ 未知=标准::向量{false,false}, NotConnected=std::vector{false,true}, Connected=std::vector{true,false}, ConnectedButNotLatched=std::vector{true,true} };
但是当我用这个编译代码时,得到的错误是'ProximityStateEnum'的底层类型'std::vector'必须是一个整数类型。如何创建向量枚举

你不能<代码>枚举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
};

enum
enum class
不是任意对象实例的别名-它们仅限于整数类型,并且每个显式值必须是常量表达式。有关更多信息,请参阅

如果要为
std::vector
的特定实例命名,请使用函数或
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};

正如其他人所说,枚举只能是整数类型

如果布尔向量的长度是常数(如示例中的2),则可以用
std::array
替换
std::vector
。使用
std::array
而不是
std::vector
的一个优点是可以将其定义为
constexpr

因此,一个合理的(IMHO)替代方法是基于
std::size\t
定义枚举类型,顺序值从
0
开始

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

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

谢谢你的回答。在我的例子中,我确实需要类型为
std::vector
。我可能会看一看带有静态成员的结构。@Xattrian:听起来像是一个XY问题,你可能应该描述一下为什么你需要它是一个
std::vector
。另外,只有静态成员的
struct
没有多大意义,请使用名称空间。谢谢你的回答。实际上,
std::bitset
也可以使用,但我以前决定坚持使用向量,所以现在我无法真正更改。您不使用enum的方法很有趣,但由于我需要对不同的值进行分组,我认为应该将它们设置为结构的静态成员
// .......................... 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]