【问题标题】:Storing different kinds of enums in same vector - C++在同一个向量中存储不同类型的枚举 - C++
【发布时间】:2016-12-14 13:39:26
【问题描述】:

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

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
...

我生成的软件是一个中间件,我将在一个运行时中只推回一种类型的枚举的元素。

基本上我想要实现的是让我的向量能够在里面存储三种不同类型的枚举,但是向量的名称不会改变。我为什么要这个?因为代码中有一个流分离并且基于分离我不知道在每个运行时开始时需要哪个枚举。

这可能吗?如果可以,我该如何实现?

编辑:谢谢大家的关注和回答,对不起,我忘了提供一个重要的细节。我的工作代码中的枚举不可编辑。它们是由框架生成的,我不能触摸它们。

提前谢谢...

【问题讨论】:

  • 通过创建标记联合并将 that 存储在向量中,假设类型对您很重要。你也可以使用boost::variant
  • 不幸的是,我无法使用任何第三方库。
  • 我觉得你没有给我们足够的信息来继续。如果你只使用一种类型的枚举,在运行时决定,那么也许所有使用这些枚举的代码都应该被封装以使具体的枚举类型不重要。
  • 我尽力提供尽可能多的细节。如果需要任何进一步的细节,请告诉我。
  • 现在感觉就像XY problem。在运行时您最终只有一种枚举类型的事实意味着要进行一个抽象,而您并没有这样做。但是您没有提供足够的信息来清楚地帮助您定义它。

标签: c++ vector enums


【解决方案1】:

这些枚举器中的每一个都可以转换为整数值,并且可以存储该值。您还必须消除值中的重叠。所以:

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调用那样暴露出来。

【讨论】:

  • 赞成 - 我更喜欢他们将enums 写入我的解决方案的方式。
  • 不应该是e4 = e3 +1吗?否则 e4 将与 e2 具有相同的值...
  • 是的,应该是。我已经为@PeteBecker 解决了这个问题。
  • 如果可以更改枚举成员的值,从长远来看可能是最明智的解决方案
  • 对不起,我忘了提供这个细节,我编辑了我的问题。枚举是由框架生成的,我无法编辑它们。
【解决方案2】:

你可以这样做:

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

【讨论】:

    【解决方案3】:

    最安全的方法是声明 C++17 的 std::variants 的向量:

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

    请参阅std::variant 了解更多信息。在 C++17 之前,Boost 提供了一个equivalent template。

    【讨论】:

      【解决方案4】:

      这是不可能的。

      例如e1 和e4 和e7 具有相同的值,因此无法区分。

      如果你能摆脱写作

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

      和

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

      那么至少枚举值都是不同的,您可以使用std::vector&lt;int&gt;。但这并不完全令人满意,因为enums 需要相互“了解”,如果你明白我的意思的话。

      否则,您必须将 type 灌输到您推送到向量的每个元素中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-21
        • 2015-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 2017-12-29
        相关资源
        最近更新 更多