Способ использовать все неквалифицированные имена в классе перечисления C ++ 0x? - PullRequest
6 голосов
/ 17 сентября 2011

Новый C ++ (C ++ 0x или C ++ 11) имеет новый тип enum, «enum class», где имена ограничиваются перечислением (среди прочего).1003 * Мне интересно, однако, могу ли я выборочно использовать неквалифицированное имя в определенной области.Что-то вроде:

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

Я вижу, что могу написать using E::VAL1 и получить одно значение.Но я не хочу делать это для каждого значения большего перечисления.

Ответы [ 2 ]

7 голосов
/ 17 сентября 2011

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

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

1 голос
/ 18 сентября 2011

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

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

Это нельзя импортировать в область видимости блока, но определяет базовый класс import_duck, чтобы привести перечислители в класс. Использование:

* * 1010

И поскольку среди производных классов существует только один тип enum, static_cast не требуется.

...