Способ использовать все неквалифицированные имена в классе перечисления 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
когда-либо требуется.