cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

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

Open mcroitor opened 7 months ago

mcroitor commented 7 months ago

Не хватает наследования 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;
}

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