Способ использовать все неквалифицированные имена в классе перечисления C++0x?

Новый C++ (C++0x или C++11) имеет новый тип enum, "enum class", где имена ограничиваются перечислением (среди прочего).

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::VAL1 и получить одно значение. Но я не хочу делать это для каждого значения большего перечисления.

2 ответа

Решение

Нет никакого способа сделать это в C++11. На всякий случай, если вы не знаете об этом - вы получите E::Val1 обозначения даже для перечисления с незаданной областью. Для такого перечисления у вас есть Val1 доступны с использованием и без использования E::,

Но вы не можете взять перечисление в определенной области и выборочно сделать все его перечислители видимыми в данной области видимости. Следует также отметить, что вы не можете написать using E::Val1, Спецификация явно запрещает это, ваш компилятор просто еще не отверг это.

Это тоже то, чего я хочу, но не удосужился попытаться решить. Вот непроверенное решение. РЕДАКТИРОВАТЬ: Я попробовал, и это прекрасно работает! Это мой самый первый служебный макрос C++11. Также я добавил перечислитель типа "один за другим", чтобы помочь расширить его до "производных" перечислений.

#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 введите даже среди производных классов, нет static_cast когда-либо требуется.

Другие вопросы по тегам