Сообщение Re[5]: std::get(std::variant) от 23.10.2025 19:52
Изменено 23.10.2025 19:53 rg45
Re[5]: std::get(std::variant)
Здравствуйте, Marty, Вы писали:
R>>А как бы ты хотел чтоб это выглядело? Можешь примерчик набросать?
M>Как-то так:
M>
M>Просто и понятно.
Ну и чем это проще и понятнее, чем:
https://coliru.stacked-crooked.com/a/83124dc3a3facc5d
И это не единственный вариант использования — тут на перегрузках можно реально по красоте всё сделать.
И я привёл законченный работающий пример, а тебе ещё нужно наколбасить энумов к своим вариантам. В итоге нифига не проще будет, а будет реально куча.
R>>А как бы ты хотел чтоб это выглядело? Можешь примерчик набросать?
M>Как-то так:
M>
M>int func(MyVariant v)
M>{
M> auto kind = getKind(v);
M> if (kind==Kind::A)
M> {
M> doSomething(get<Kind::A>(v));
M> // doSomething(get(kind, v)); // или даже так
M> }
M> else if (kind==Kind::B || kind==Kind::C)
M> {
M> log << "Error: " << enum_serialize(kind) << " not allowed here\n";
M> return -1; // error - B or C not allowed here
M> }
M> else
M> {
M> return 0; // OK
M> }
M>}
M>M>Просто и понятно.
Ну и чем это проще и понятнее, чем:
https://coliru.stacked-crooked.com/a/83124dc3a3facc5d
int func(MyVariant v)
{
return std::visit([]<typename T>(const T& t) {
if constexpr (std::same_as<T, A>)
{
doSomething(t);
}
else if constexpr (std::same_as<T, B> or std::same_as<T, C>)
{
std::cout << "Error: B or C not allowed here\n";
return -1;
}
return 0; // OK
}, v);
}И это не единственный вариант использования — тут на перегрузках можно реально по красоте всё сделать.
И я привёл законченный работающий пример, а тебе ещё нужно наколбасить энумов к своим вариантам. В итоге нифига не проще будет, а будет реально куча.
Re[5]: std::get(std::variant)
Здравствуйте, Marty, Вы писали:
R>>А как бы ты хотел чтоб это выглядело? Можешь примерчик набросать?
M>Как-то так:
M>
M>Просто и понятно.
Ну и чем это проще и понятнее, чем:
https://coliru.stacked-crooked.com/a/83124dc3a3facc5d
И это не единственный, и не лучший, кстати, вариант использования — тут на перегрузках можно реально по красоте всё сделать.
И я привёл законченный работающий пример, а тебе ещё нужно наколбасить энумов к своим вариантам. В итоге нифига не проще будет, а будет реально куча.
R>>А как бы ты хотел чтоб это выглядело? Можешь примерчик набросать?
M>Как-то так:
M>
M>int func(MyVariant v)
M>{
M> auto kind = getKind(v);
M> if (kind==Kind::A)
M> {
M> doSomething(get<Kind::A>(v));
M> // doSomething(get(kind, v)); // или даже так
M> }
M> else if (kind==Kind::B || kind==Kind::C)
M> {
M> log << "Error: " << enum_serialize(kind) << " not allowed here\n";
M> return -1; // error - B or C not allowed here
M> }
M> else
M> {
M> return 0; // OK
M> }
M>}
M>M>Просто и понятно.
Ну и чем это проще и понятнее, чем:
https://coliru.stacked-crooked.com/a/83124dc3a3facc5d
int func(MyVariant v)
{
return std::visit([]<typename T>(const T& t) {
if constexpr (std::same_as<T, A>)
{
doSomething(t);
}
else if constexpr (std::same_as<T, B> or std::same_as<T, C>)
{
std::cout << "Error: B or C not allowed here\n";
return -1;
}
return 0; // OK
}, v);
}И это не единственный, и не лучший, кстати, вариант использования — тут на перегрузках можно реально по красоте всё сделать.
И я привёл законченный работающий пример, а тебе ещё нужно наколбасить энумов к своим вариантам. В итоге нифига не проще будет, а будет реально куча.