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

Сообщение Re[2]: std::get(std::variant) от 23.10.2025 19:40

Изменено 23.10.2025 19:49 Marty

Re[2]: std::get(std::variant)
Здравствуйте, rg45, Вы писали:

R>В общем, осваивай std::variant, и твоя жизнь сразу упростится.


Или вот вот такой пример. Есть variant с парой десятков альтернатив. У половины альтернатив есть атрибут name, у других нет. Я хочу функцию, которая возвращает name, если он есть, или пустую строку, если его нет. Чтобы выше не парится, выписывая везде std::visit для получения этого атрибута.

auto kind = getKind(v);
name = getName(kind, v);


Как мне такое сделать?
Re[2]: std::get(std::variant)
Здравствуйте, rg45, Вы писали:

R>В общем, осваивай std::variant, и твоя жизнь сразу упростится.


Или вот вот такой пример. Есть variant с парой десятков альтернатив. У половины альтернатив есть атрибут name, у других нет. Я хочу функцию, которая возвращает name, если он есть, или пустую строку, если его нет. Чтобы выше не парится, выписывая везде std::visit для получения этого атрибута.

auto kind = getKind(v);
name = getName(kind, v);


Как мне такое сделать?

Я пока портяночно написал, но вот думаю, как бы можно было бы это лучше сделать.

например:

string getNameImpl(Kind kind, Variant v, initializer_list<Kind> hasNameList)
{
    for(auto k: hasNameList)
    {
        if (k==kind)
            return visit([](auto a) { return a.name; });
    }

    return string();
}

string getName(Kind kind, Variant v)
{
    return getNameImpl(kind, x, {Kind::A, Kind::B, ...});
}


Ну или как-то так