Существует ли директива using
, которая импортирует элементы enum class
непосредственно в глобальное пространство имен модуля компиляции?
У нас есть:
enum Lexeme {....lots of names...};
bool Matches(int lookAhead, Lexeme lxm);
Это рискованно, потому что пользователи часто забывают, что первый аргумент Matches
означает «соответствует либо», и пишут:
if (Matches(ADD,SUB)) ...
Компилятор C ++ совершенно счастлив, принимая ADD
в качестве целого.
Итак, я попытался сделать Lexeme
an enum class
:
enum class Lexeme { ...}
Это ловит ошибку. Но теперь моя проблема заключается в том, что весь код, который использует Lexeme
константы, должен написать enum class
имя:
if (Matches(Lexeme::ADD,Lexeme::SUB)) ...
Существует ли директива using
или другая хитрость, чтобы вытянуть все имена Lexeme::*
в текущую область? Обратите внимание, что большинство токенов используются в классе (я понимаю, что правильное определение констант является одним из механизмов обеспечения безопасности enum class
).
Возможно, лучший план - изменить Matches
на MatchesAt
или что-то еще, чтобы избежать проблемы? Но я хотел знать правила для C ++ и C ++ XX, по крайней мере.
Что я пробовал:
Это связано, но не относится к необходимым enum class
префиксам.
Я тоже пробовал что-то вроде using foo::bar::Lexeme
; но увы безрезультатно.