1. ホーム
  2. c++

[解決済み] C++でintをenumにキャストする一般的な方法

2023-07-29 08:11:37

質問

をキャストする一般的な方法はありますか? intenumC++ ?

もし int の範囲に含まれる場合 enum の範囲にある場合は enum の値を返し、そうでなければ exception . と書く方法はありますか? を一般的に ? 複数の enum type がサポートされている必要があります。

背景 私は外部の 列挙 型と 制御なし をソースコードの上に置くことができます。この値をデータベースに保存して、それを取得したいのです。

どのように解決するのですか?

明らかなことは、enumに注釈をつけることです。

// generic code
#include <algorithm>

template <typename T>
struct enum_traits {};

template<typename T, size_t N>
T *endof(T (&ra)[N]) {
    return ra + N;
}

template<typename T, typename ValType>
T check(ValType v) {
    typedef enum_traits<T> traits;
    const T *first = traits::enumerators;
    const T *last = endof(traits::enumerators);
    if (traits::sorted) { // probably premature optimization
        if (std::binary_search(first, last, v)) return T(v);
    } else if (std::find(first, last, v) != last) {
        return T(v);
    }
    throw "exception";
}

// "enhanced" definition of enum
enum e {
    x = 1,
    y = 4,
    z = 10,
};

template<>
struct enum_traits<e> {
    static const e enumerators[];
    static const bool sorted = true;
};
// must appear in only one TU,
// so if the above is in a header then it will need the array size
const e enum_traits<e>::enumerators[] = {x, y, z};

// usage
int main() {
    e good = check<e>(1);
    e bad = check<e>(2);
}

で配列を最新に保つ必要があります。 e の作者でない場合、これは厄介なことです。 e . Sjoerd が言うように、これはおそらくどんなまともなビルドシステムでも自動化することができます。

いずれにせよ、あなたは 7.2/6 に直面することになります。

eminが最小の列挙体、emaxが最大列挙体である列挙体に対して が最小の列挙子で、emax が最大の列挙子です。 である場合、列挙型の値 の値は、基礎となる型 の値で、bminからbmaxの範囲である。 とbmaxはそれぞれ の最小値および最大値である。 の最小値と最大値です。 とemaxを格納できる最小のビットフィールドの最小値と最大値である。を定義することが可能である。 を定義することができる。 を定義することができます。

の作者でない場合は e の有効な値が保証されているかどうかはわかりません。 e の有効な値が実際にその定義に現れるかどうかは保証の限りではない。