cpp-ru / ideas

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

Добавить полезную вещь энумератам. #544

Open ghost opened 1 year ago

ghost commented 1 year ago

Сделать enum чуть полезнее, чтобы можно было спокойно получать значение, зная какое значение имеет энумерат.

Данная вещь будет полезна при создании обработчика событий браузера, написании игровых движков и там, где нужно зная какое значение имеет энумерат, получить значение.

Как в Rust'е на данный момент:

enum DayTime{

    Morning(String),
    Evening(String)
}

fn main(){
//получили откуда-то значение var
match var {
    Morning(a) => {/* что-то */},
    Evening(b) => {/* что-то */}
}
}

Как это выглядело бы в C++:

struct  Data{
    enum class Types{
       WebErrorCode,
       LoadedTime
    };
   Types t;
   std::variant<int,float> values;
};
int main() {
//взяли откуда-то экземпляр типа `Data`
if (d.t == Data::Types::WebErrorCode){
    //Тут дальше что-то делаете со значениями
}
}

Как хотелось бы в C++:

enum Data{
    WebErrorCode(int),
    LoadedTime(float)
};

int main(){
//откуда-то получили данные
if (D == Data::WebErrorCode){
    int res = std::get<Data::WebErrorCode>(D); //Если попробовать получить Data::LoadedTime, то кидало бы ошибку компиляции.
    //Дальше что-то делаете с этим.
}
}

Также можно расширить switch, которым никто особо не пользуется, до match как в первом примере.

apolukhin commented 1 year ago

А чем не подходит или не удобен std::visit?

ghost commented 1 year ago

Он тоже подходит, но так выглядело бы лаконично. К тому же хороший сахар.