在同一C++中存储不同类型的枚举
Storing different kinds of enums in same C++
在我的代码中,我有一个这样的结构:
enum myEnum{ e1, e2, e3};
std::vector myVector<myEnum>;
...
myVector.push_back(e1);
...
myVector.push_back(e2);
...
我需要做的是,我必须定义另外两个枚举,例如
enum myEnum2{ e4, e5, e6};
enum myEnum3{ e7, e8, e9};
我必须找到一种方法将所有这三个枚举存储在同一个向量中,让我使用这个向量,如下所示:
myVector.push_back(e1); //element of myEnum
...
myVector.push_back(e4); //element of myEnum2
...
我生成的软件是一个中间件,我将在单个运行时中仅推回一种枚举类型的元素。
基本上我想要实现的是让我的向量能够在里面存储三种不同类型的枚举,但向量的名称不会改变。我为什么想要这个?因为代码中存在流分离,并且基于分离,我不知道在每个运行时开始时需要哪个枚举。
这是否可能,如果是,我该如何实现这一目标?
编辑:谢谢大家的关注和回答,对不起,我忘了给出一个重要的细节。我的工作代码中的枚举不可编辑。它们是由框架生成的,我不允许触摸它们。
提前感谢...
这些枚举器中的每一个都可以转换为整数值,并且可以存储该值。您还必须消除值中的重叠。所以:
enum myEnum { e1, e2, e3 };
enum myEnum2 { e4 = e3 + 1, e5, e6 };
enum myEnum3 { e7 = e6 + 1, e8, e9 };
std::vector<int> myVector;
myVector.push_back((int)e1);
当然,转换值和恢复值的细节应该封装在一个类中,而不是像这里的push_back
调用那样公开。
你可以这样做:
vector<variant<MyEnum1, MyEnum2>>
但是,既然您说每次运行期间只有一个类型,那么最好是:
variant<vector<MyEnum1>, vector<MyEnum2>>
这样更高效,更清楚地表达您的实际需求。 但是,您也可以选择更简单的方法:
vector<int>
并根据需要进行投射。
如果你想要一些最大类型安全的东西而不是使用 C++17,你可以自己实现它:
struct EnumVector {
enum Type { type1, type2 };
EnumVector(Type type) : _type(type)
void push_back(MyEnum1 val) {
assert(_type == type1);
_storage.push_back(val);
}
void push_back(MyEnum2 val) {
assert(_type == type2);
_storage.push_back(val);
}
private:
Type _type;
std::vector<int> _storage;
};
最安全的方法就是声明一个 C++17 的std::variant
s 向量:
std::vector<std::variant<myEnum1, myEnum2, myEnum3>> myVector;
有关更多信息,请参阅 std::variant 。在 C++17 之前,Boost 会提供等效的模板。
这是不可能的。
例如e1
和e4
,e7
两者都具有相同的值,因此无法区分。
如果你能侥幸逃脱写作
enum myEnum2{ e4 = 3, e5, e6};
和
enum myEnum3{ e7 = 6, e8, e9};
那么至少枚举的值都是不同的,您可以使用std::vector<int>
.但这并不完全令人满意,因为如果你明白我的意思,enum
需要"了解"对方。
否则,您必须将类型注入到推送到向量的每个元素中。
- 在有符号基础类型枚举的位域上溢出
- 在编译时将强类型枚举器转换为其基础类型?
- 如果 int 是"not within the enums range",为什么将 int 转换为强类型枚举会编译?
- 类型枚举的变量不是类型名称
- 强类型枚举的语法实现错误
- 枚举与强类型枚举
- 错误:T没有命名类型-用于使用强类型枚举的专门化
- 如何使用强类型枚举
- QT:将强类型枚举参数传递到插槽
- 在类定义中声明类型(枚举、结构等)会增加代码大小
- Visual Studio 11 (beta) 中的强类型枚举类
- 使用强类型枚举对类型和子类型进行建模
- 不允许将强类型枚举用作同一基础类型的参数
- 如何正确使用C++强类型枚举
- 带有强类型枚举的模板参数推导
- 是否可以在googleprotobuf中为类型(枚举或消息)定义一个别名
- C++中默认初始化的全局强类型枚举是什么
- std::is_signed不适用于强类型枚举:int
- 如何定义自定义值的类型?(枚举类型定义)
- 将强类型枚举传递给函数