C++ 在同一个向量中存储不同种类的枚举-C++;
在我的代码中,我的结构如下:C++ 在同一个向量中存储不同种类的枚举-C++;,c++,vector,enums,C++,Vector,Enums,在我的代码中,我的结构如下: enum myEnum{ e1, e2, e3}; std::vector myVector<myEnum>; ... myVector.push_back(e1); ... myVector.push_back(e2); ... 我必须找到一种方法将这三个枚举存储在同一个向量中,让我使用这个向量,如: myVector.push_back(e1); //element of myEnum ... myVector.push_back(e4);
enum myEnum{ e1, e2, e3};
std::vector myVector<myEnum>;
...
myVector.push_back(e1);
...
myVector.push_back(e2);
...
我必须找到一种方法将这三个枚举存储在同一个向量中,让我使用这个向量,如:
myVector.push_back(e1); //element of myEnum
...
myVector.push_back(e4); //element of myEnum2
...
我得到的软件是一个中间件,我将在一个运行时中只推回一种枚举类型的元素
基本上我想要实现的是让我的向量能够在里面存储三种不同类型的枚举,但是向量的名称不会改变。我为什么要这个?因为代码中有一个流分离,并且基于这个分离,我不知道在每个运行时开始时需要哪个枚举
这可能吗?如果可能的话,我如何才能做到这一点
编辑:谢谢大家的关注和回答,很抱歉我忘了提供一个重要的细节。我的工作代码中的枚举不可编辑。它们是由框架生成的,我不允许触摸它们
提前感谢…最安全的方法是声明C++17的
std::variant的向量:
std::vector<std::variant<myEnum1, myEnum2, myEnum3>> myVector;
std::vector myVector;
有关更多信息,请参阅。在C++17之前,Boost提供了一个。这是不可能的
例如e1
和e4
以及e7
都具有相同的值,因此无法区分
如果你可以不写东西
enum myEnum2{e4=3,e5,e6}代码>
及
enum myEnum3{e7=6,e8,e9}代码>
然后,至少枚举值都不同,您可以使用std::vector
。但这并不完全令人满意,因为如果你明白我的意思的话,enum
s需要相互“了解”
否则,您必须在推送到向量的每个元素中插入一个类型。您可以这样做:
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;
};
结构枚举向量{
枚举类型{type1,type2};
枚举向量(类型):\u类型(类型)
无效推回(MyEnum1 val){
断言(_type==type1);
_存储。推回(val);
}
无效推回(MyEnum2 val){
断言(_type==type2);
_存储。推回(val);
}
私人:
类型_类型;
std::矢量存储;
};
这些枚举数中的每一个都可以转换为整数值,并且可以存储该值。您还必须消除值中的重叠。因此:
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);
enum myEnum{e1,e2,e3};
枚举myEnum2{e4=e3+1,e5,e6};
枚举myEnum3{e7=e6+1,e8,e9};
std::vector myVector;
myVector.push_back((int)e1);
当然,转换值和恢复值的细节应该封装在一个类中,而不是像这里的push_back
调用那样公开。通过创建标记的并集并将其存储在向量中,假设类型对您很重要。您也可以使用boost::variant
不幸的是,我不能使用任何第三方库。我觉得您没有给我们提供足够的信息继续。如果您只使用一种类型的枚举(在运行时决定),那么可能应该封装使用这些枚举的所有代码,使具体的枚举类型无关紧要。你可以告诉我任何需要的细节。这感觉像是一个新的开始。事实上,在运行时只有一个枚举类型,这意味着需要进行抽象,而不是进行抽象。但是您没有提供足够的信息来清楚地帮助您定义它。向上投票-我更喜欢您在我的解决方案中编写enum
s的方式。它不应该是e4=e3+1吗?否则e4将具有与e2相同的值…是的,它应该是。我已经为@PeteBecker解决了这个问题。如果可以更改枚举成员的值,这可能是长期以来最明智的解决方案。对不起,我忘了提供详细信息,我编辑了我的问题。枚举是由框架生成的,我无法编辑它们。
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);