Информация об изменениях

Сообщение 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>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>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);
}


И это не единственный, и не лучший, кстати, вариант использования — тут на перегрузках можно реально по красоте всё сделать.

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