2013-07-24 5 views
5

У меня есть перечисление, как это: (На самом деле, это класс перечисления)ЬурейиХ и перечисление или перечисление класс

enum class truth_enum { 
    my_true = 1, 
    my_false = 0 
}; 

Я хотел бы иметь возможность подвергать my_true глобального пространства имен, так что я могу сделать это:

char a_flag = my_true; 

Или, по крайней мере:

char a_flag = (char)my_true; 

Вместо этого:

char a_flag = truth_enum::my_true; 

Возможно ли это?

Я пытался что-то вроде этого:

typedef truth_enum::my_true _true_; 

Я получаю ошибку: my_true в классе перечисление truth_enum не называет тип

Я предполагаю, что my_true это значение не является типом. Есть ли альтернатива, которую я могу сделать, чтобы включить эту функцию в мои программы?

Не идеально, но я мог бы сделать что-то вроде:

enum class : const char { ... }; 
const char const_flag_false = truth_enum::my_false; 

Хм ...

+0

Если вы используете класс enum, вы не можете избежать написания префикса. многословие не является проблемой, если это не препятствует читаемости. – yngccc

+0

Перечислитель класса enum не подразумевает конвертацию в целое число, поэтому 'char a_flag = my_true;' в любом случае ошибочен. –

+0

Я использовал преобразование выше – user3728501

ответ

1

Удалить class из enum определения. Я предполагаю, что вы оскорблены неявным преобразованием в int. Как насчет:

static constexpr truth_enum _true_ = truth_enum::my_true; 
static constexpr truth_enum _false_ = truth_enum::my_false; 

или просто

const truth_enum _true_ = truth_enum::my_true; 
const truth_enum _false_ = truth_enum::my_false; 
+0

Хорошо, я рассмотрю эту секунду. Мне нужно исправить свой код, пока я помню – user3728501

+0

Что делает статический contexpr? Собственно, что делает contexpr? – user3728501

+0

'constepxr'applied к переменной делает ее' const' и заставляет компилятор вычислять свой инициализатор во время компиляции. В этом конкретном случае он в основном идентичен 'const' - я, вероятно, злоупотребляю кричащей новой конструкцией в тех местах, где она работает, но на самом деле не нужна. – Casey

0

Решение было легко, ошибка, которую я сделал, чтобы использовать enum class вместо перечисления.

Да, так еще немного запутался на самом деле - я могу теперь просто использовать значения, как:

bool aboolean = (bool)my_true; 

Вместо того, чтобы сделать это:

bool aboolean = (bool)truth_enum::my_true; 

Почему это? (Сделано сообщество wiki, поэтому люди могут редактировать ...)

+0

Перечисления в C++ наследуют от C, где это почти просто макрос препроцессора. Таким образом, это видно в глобальном пространстве имен. –