ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Наследование enum class

Open mcroitor opened this issue 2 years ago • 0 comments

Не хватает наследования enum class.

На данный момент возможен следующий код:

#include <iostream>

enum class pin_type: uint8_t
{
    d0, d1, d2, a0 = 10, a1,
};
enum class digital_pin_type: uint8_t {
    d0, d1, d2,
};
enum class analog_pin_type: uint8_t {
    a0 = 10, a1,
};

int main()
{
    pin_type pin = static_cast<pin_type>(analog_pin_type::a0); // ok
    digital_pin_type dpin = static_cast<digital_pin_type>(pin_type::d1); // ok
    analog_pin_type apin = static_cast<analog_pin_type>(pin_type::d1); // logic error, but works

    std::cout << (size_t)pin << " " << (size_t)dpin << " " << (size_t)apin;
    return 0;
}

Однако в нем отслеживание на правильность связи между перечислениями ложится на разработчика. Поэтому хочется иметь возможность указать зависимость (наследование) одного перечисления от другого. Ожидаемый код:

#include <iostream>

enum class pin_type: uint8_t
{
    d0, d1, d2, a0 = 10, a1,
};
enum class digital_pin_type: pin_type {
    d0 = pin_type:d0, d1, d2,
};
enum class analog_pin_type: pin_type {
    a0 = pin_type:a0, a1,
};

int main()
{
    pin_type pin = analog_pin_type::a0; // ok
    digital_pin_type dpin = pin_type::d1; // ok
    analog_pin_type apin = pin_type::d1; // compile error

    std::cout << (size_t)pin << " " << (size_t)dpin << " " << (size_t)apin;
    return 0;
}

Ожидаемые свойства:

  • дочернее перечисление содержит некоторый набор значений из базового перечисления
  • дочернее перечисление может содержать псевдонимы значений
  • дочернее перечисление не содержит других значений, на совместимых с базовым перечислением
  • неявное приведение типов, дочернего к базовому
  • при приведении типов от базового к дочернему выдача ошибки / предупреждения

mcroitor avatar Nov 23 '23 08:11 mcroitor