【问题标题】:Check same enum, C++检查相同的枚举,C++
【发布时间】:2020-12-05 00:41:12
【问题描述】:

我现在正在抽象我的问题,但我处于这种情况。 假设我有 2 个枚举在同一个命名空间中。

namespace some_namespace {
    enum class Something{
        S,
        O,
        M,
        E,
        T,
        H,
        I,
        N,
        G
    };

    enum class Else{
        E,
        L,
        S
    };
}

现在让我们创建 2 个结构体,它们将这些枚举的一些值作为静态字段。

struct SomeStruct{
    static constexpr int enumValue = static_cast<int>(some_namespace::Something::T);
};

struct AnotherStruct {
    static constexpr int enumValue = static_cast<int>(some_namespace::Something::O);
};

如何检查这 2 个结构的 enumValues 是否来自同一个 enum class?我想我应该给我的枚举字段一些值,并在枚举值上使用一些按位运算符来区分?有人可以帮忙吗?谢谢)

【问题讨论】:

  • 你不能。 C++ 不能以这种方式工作。当你完成声明它们时,它们只是普通的、无名的ints。它们原来的枚举类型已被永远剥离,消失在以太的神秘之中。
  • 有人想知道为什么不将它们保存为原始枚举?
  • 我认为有一种方法可以为枚举元素分配一些整数值,然后例如 auto same.= SomeStruct::enumValue &amp; AnotherStruct::enumValue if(same == 1){//same enum} else {//not same enum}

标签: c++ struct enums integer compare


【解决方案1】:

仅使用 static_casted enumValue 无法区分原始枚举(正如@Sam 所指出的那样)。相反,您可以做的是引入一个新字段来存储底层枚举类类型并利用它来区分。

enum class E1{ One, Two };
enum class E2{Three, Four };

struct SomeStruct{
    static constexpr int enumValue = static_cast<int>(E1::One);
    using UnderlyingT = E1;
};

struct AnotherStruct {
    static constexpr int enumValue = static_cast<int>(E2::Three);
    using UnderlyingT = E2;
};

static_assert(!std::is_same_v<SomeStruct::UnderlyingT, AnotherStruct::UnderlyingT>);

Code Link

【讨论】:

  • 实际上,您只是以这种方式将枚举重新定义为结构 - 这似乎毫无意义。
【解决方案2】:

正如 cmets 中已经指出的那样,如果您仍想知道类型,您不想将您的枚举转换为 int

在想要隐式转换为基础类型时,可能有一些原因要保留类型和范围。

您可以做的是将枚举包装到一个类中,该类既可以转换为基础类型又可以转换为实际的枚举。

#include <type_traits>
template<typename TEnum>
class ImplicitEnumConverter final
{
public:
    TEnum e;
    using TUnderlyingType = std::underlying_type_t<TEnum>;

    constexpr ImplicitEnumConverter(TEnum e) : e{e} {}

    constexpr operator TUnderlyingType() const noexcept
    {
        return static_cast<TUnderlyingType>(e);
    }
    constexpr operator TEnum() const noexcept
    {
        return e;
    }
};

struct SomeStruct{
    static constexpr auto enumValue = ImplicitEnumConverter{some_namespace::Something::T};
};

Code at compiler-explorer

这样,您可以保留所有相关的类型安全信息,并且可以将其隐式转换为 int。

【讨论】:

    【解决方案3】:

    答案比我想象的要简单。

    所以我这样声明枚举。

    namespace some_namespace {
        enum class Something{
            S = 0,
            O = 2,
            M = 4,
            E = 6,
            T = 8,
            H = 10,
            I = 12,
            N = 14,
            G = 16
        };
    
        enum class Else{
            E = 1,
            L = 3,
            S = 5
        };
    }
    

    然后这导致我检查 两个整数值是否具有相同的奇偶性。因此

    if((SomeStruct::enum_value + AnotherStruct::enum_value) % 2 == 0) {
        // Same enum
    } else {
        // not same enum.
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多