Сообщение Re[2]: std::get(std::variant) от 23.10.2025 19:40
Изменено 23.10.2025 19:52 Marty
Re[2]: std::get(std::variant)
Здравствуйте, rg45, Вы писали:
R>В общем, осваивай std::variant, и твоя жизнь сразу упростится.
Или вот вот такой пример. Есть variant с парой десятков альтернатив. У половины альтернатив есть атрибут name, у других нет. Я хочу функцию, которая возвращает name, если он есть, или пустую строку, если его нет. Чтобы выше не парится, выписывая везде std::visit для получения этого атрибута.
Как мне такое сделать?
Я пока портяночно написал, но вот думаю, как бы можно было бы это лучше сделать.
например:
Ну или как-то так
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, ...});
}Ну или как-то так
Re[2]: std::get(std::variant)
Здравствуйте, rg45, Вы писали:
R>В общем, осваивай std::variant, и твоя жизнь сразу упростится.
Или вот вот такой пример. Есть variant с парой десятков альтернатив. У половины альтернатив есть атрибут name, у других нет. Я хочу функцию, которая возвращает name, если он есть, или пустую строку, если его нет. Чтобы выше не парится, выписывая везде std::visit для получения этого атрибута.
Как мне такое сделать?
Я пока портяночно написал, но вот думаю, как бы можно было бы это лучше сделать.
например:
Ну или как-то так
Тут наверное без вариадик тайплиста не обойтись, но хочется как-то попроще
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, ...});
}Ну или как-то так
Тут наверное без вариадик тайплиста не обойтись, но хочется как-то попроще