連続列挙型C ++ 11

バート :

列挙型である場合、C ++で11をチェックする方法がある連続は

そうではありません列挙値を与えるために完全に有効です。C ++ 14で型特性のような機能が多分あり、C ++ 17または多分C ++ 20のチェックには、列挙型が連続しているのですか?これは、static_assertに使用されます。

小さな例は次のとおりです。

enum class Types_Discontinuous {
  A = 10,
  B = 1,
  C = 100
};

enum class Types_Continuous {
  A = 0,
  B = 1,
  C = 2
};

static_assert(SOME_TEST<Types_Discontinuous>::value, "Enum should be continuous"); // Fails
static_assert(SOME_TEST<Types_Continuous>::value, "Enum should be continuous");    // Passes
N. SHEAD:

数についてenumのあなたはおそらく使用して、このを通してあなたの方法をハックすることができマジック列挙ライブラリを。例えば:

#include "magic_enum.hpp"

template <typename Enum>
constexpr bool is_continuous(Enum = Enum{}) {
    // make sure we're actually testing an enum
    if constexpr (!std::is_enum_v<Enum>)
        return false;
    else {
        // get a sorted list of values in the enum
        const auto values = magic_enum::enum_values<Enum>();
        if (std::size(values) == 0)
            return true;

        // for every value, either it's the same as the last one or it's one larger
        auto prev = values[0];
        for (auto x : values) {
            auto next = static_cast<Enum>(magic_enum::enum_integer(prev) + 1);
            if (x != prev && x != next)
                return false;
            else
                prev = x;
        }
        return true;
    }
}

ライブラリ名が示すとおり、これは、確かであることに注意してください、「魔法」 - コンパイラ固有のハックの数のライブラリ関数。そのようなものとして、それは本当に「純粋なC ++」のあなたの要件を満たしていませんが、我々は言語で反射施設を持つまで、我々が得ることができるように良いと考えられます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=30141&siteId=1