6

新しいC++(C++0xまたはC++11)には、新しい種類の列挙型、つまり名前が(とりわけ)列挙型にスコープされる「列挙型クラス」があります。

enum class E {
    VAL1, VAL2
};

void fun() {
    E e = E::VAL1;  // Qualified name
}

ただし、特定のスコープで非修飾名を選択的に使用できるかどうか疑問に思います。何かのようなもの:

void fun() {
    using E::*;
    E e = VAL1;
    switch (e) {
        case VAL2: ...

using E::VAL11つの値を記述して取得できるようです。しかし、より大きな列挙型のすべての値に対してそれを実行したくはありません。

4

2 に答える 2

7

C++11でこれを行う方法はありません。気づいていない場合に備えてE::Val1、スコープのない列挙でも表記を取得します。このような列挙では、をVal1使用してもしなくてもアクセスできますE::

ただし、スコープ付き列挙を取得して、そのすべての列挙子を特定のスコープで選択的に表示することはできません。また、を書くことはできませんusing E::Val1のでご注意ください。仕様ではこれを明示的に禁止しています。コンパイラはまだこれを拒否していません。

于 2011-09-17T19:11:13.993 に答える
1

これも私がたまたま望んでいたことですが、解決しようとはしていません。これがテストされていない解決策です。編集:私はそれを試してみました、そしてそれは素晴らしい働きをします!これは私の最初のC++11ユーティリティマクロです。また、「派生した」列挙に拡張できるように、過去1つの列挙子を追加しました。

#define IMPORTABLE_ENUM( TYPENAME, ... ) \
\
struct import_ ## TYPENAME { \
    enum TYPENAME { \
        __VA_ARGS__ \
    }; \
}; \
\
typedef import_ ## TYPENAME :: TYPENAME TYPENAME;

これをブロックスコープにインポートすることはできませんがimport_duck、列挙子をクラスに取り込むための基本クラスを定義します。使用法:

IMPORTABLE_ENUM ( duck, huey, dewey, louie )

duck d = duck::dewey; // can't use unscoped enumerators here

struct duck_madness : private import_duck { // but inside a derived class
    duck who_did_it() { return huey; } // qualification is unnecessary
}

enumまた、派生クラスの中でもタイプは1つしかないため、必要ありませんstatic_cast

于 2011-09-17T21:26:38.937 に答える