ideas icon indicating copy to clipboard operation
ideas copied to clipboard

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

Open ghost opened this issue 2 years ago • 2 comments

Сделать 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 как в первом примере.

ghost avatar Jan 13 '23 19:01 ghost

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

apolukhin avatar Feb 24 '23 17:02 apolukhin

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

ghost avatar Mar 02 '23 16:03 ghost