typedef и enum или класс enum

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

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 в классе enum true_enum не называет тип

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

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

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

person FreelanceConsultant    schedule 24.07.2013    source источник
comment
если вы используете класс перечисления, вы не можете избежать написания префикса. многословность не является проблемой, если только она не мешает читабельности.   -  person yngccc    schedule 24.07.2013
comment
Перечислитель enum class не преобразует неявно в целое число, поэтому char a_flag = my_true; в любом случае неверен.   -  person Jonathan Potter    schedule 24.07.2013
comment
Я использовал преобразование выше   -  person FreelanceConsultant    schedule 24.07.2013


Ответы (2)


Удалите 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;
person Casey    schedule 24.07.2013
comment
Хорошо, я посмотрю на эту секунду, мне нужно исправить мой код, пока я помню - person FreelanceConsultant; 24.07.2013
comment
Что делает статический контекст? Собственно, что делает contexpr? - person FreelanceConsultant; 24.07.2013
comment
constepxrприменяется к переменной, делает ее const и заставляет компилятор вычислять свой инициализатор во время компиляции. В этом конкретном случае он в основном идентичен const — я, вероятно, злоупотребляю новой кричащей конструкцией в тех местах, где она работает, но на самом деле не нужна. - person Casey; 24.07.2013
comment
хорошо, мне это нравится, но это необходимо? Как только я удалил ключевое слово class, он скомпилировался абсолютно нормально. Я могу использовать my_true, не выполняя truth_enum::my_true — должен ли я это делать? - person FreelanceConsultant; 24.07.2013
comment
По-видимому, то, что я описал выше, является ожидаемым поведением для перечисления, но не класса перечисления. - person FreelanceConsultant; 24.07.2013
comment
@EdwardBird: Основная причина enum class - это пространство имен, скрывающее нежелательное. - person Ben Jackson; 24.07.2013
comment
@EdwardBird enum class делает две вещи: (1) ограничивает область действия перечислителей, (2) запрещает неявное преобразование из типа перечислителя в int. Я предполагал, что вы хотите сохранить (2) и обходной путь (1). Если вас не беспокоит (2), то простое enum определенно является решением, которое вам нужно. - person Casey; 24.07.2013
comment
@Casey Кейси Извините, надо было прояснить! Неявное преобразование было бы скорее хорошим, чем плохим на самом деле... - person FreelanceConsultant; 24.07.2013

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

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

bool aboolean = (bool)my_true;

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

bool aboolean = (bool)truth_enum::my_true;

Почему это?

person Community    schedule 24.07.2013
comment
Перечисления в C++ наследуются от C, где это просто макрос препроцессора. Таким образом, он виден в глобальном пространстве имен. - person Richard J. Ross III; 24.07.2013