在同一C++中存储不同类型的枚举

Storing different kinds of enums in same C++

本文关键字:同类型 枚举 存储 C++      更新时间:2023-10-16

在我的代码中,我有一个这样的结构:

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::variants 向量:

std::vector<std::variant<myEnum1, myEnum2, myEnum3>> myVector;

有关更多信息,请参阅 std::variant 。在 C++17 之前,Boost 会提供等效的模板。

这是不可能的。

例如e1e4e7两者都具有相同的值,因此无法区分。

如果你能侥幸逃脱写作

enum myEnum2{ e4 = 3, e5, e6};

enum myEnum3{ e7 = 6, e8, e9};

那么至少枚举的值都是不同的,您可以使用std::vector<int>.但这并不完全令人满意,因为如果你明白我的意思,enum需要"了解"对方。

否则,您必须将类型注入到推送到向量的每个元素中。