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]