Определите перечисление с помощью CPP strong-typedef

#c #enums #typedef #strongly-typed-enum

#c #перечисления #typedef #strongly-typed-enum

Вопрос:

При определении структуры сетевого сообщения:

  1. Хотите сохранить поле Op в качестве перечисления (чтобы ограничить допустимые значения).
  2. Необходимо сохранить все поля как беззнаковые, а Op, в частности, должен быть uint32_t.

Есть ли способ объединить эти требования? что-то вроде: typedef enum Op : uint32_t {сохранить = 100, извлечь = 101, удалить = 200};

Комментарии:

1. "100" "101" "200 Что означают эти строки? Вы хотите использовать строку в качестве перечислителя в enum?

2. enum class ? Я понятия не имею, чего вы хотите.

3. В основном хотят сузить допустимое значение -> Перечисление —> строка. Буду признателен за другие предложения. Спасибо. open-std.org/JTC1/SC22/wg21/docs/papers/2016/p0138r2.pdf

4. @Sprite, я отредактировал перечисление после вашего Q. Спасибо.

5. Не ясно, что вы хотите, если это перечисление с определенным типом, тогда оно у вас есть на C 11 следующим образом: enum name : type { enumerator = constexpr , enumerator = constexpr , ... }

Ответ №1:

"100" "101" "200

Ну, я не совсем понимаю, что означают эти строки? Ваш вопрос мне не очень понятен.

Похоже, то, что вы хотите, это enum class (перечисления с ограниченной областью действия).

 enum class Op : uint32_t
{
    _100 = 100,
    _101 = 101,
    _200 = 200
};
 

ограничение допустимых значений

ДА.

Необходимо сохранить все поля как беззнаковые, а Op, в частности, должен быть uint32_t.

ДА.

Вы должны назвать эти перечислители чем-то значимым, а не таким же, как значение.


В соответствии с вашим отредактированным сообщением:

 enum class Op : uint32_t
{
    save = 100,
    retrieve = 101,
    delete_ = 200
};
 

Комментарии:

1. Отлично, спасибо!