std::get(std::variant)
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 22.10.25 20:20
Оценка:
Здравствуйте!

Я тут начал довольно активно пользоваться std::variant, и часто возникает задача — узнать, что там во варианте лежит. Также возникает задача получить лежащее там значение.

Мне не нравится то, что std::get принимает std::size_t индекс, а std::variant::index() возвращает std::size_t, а std::holds_alternative принимает тип.

Я каждый раз для каждого variant делаю перечисление enum class, если мой variant — MyVariant, то перечисление — MyVariantKind. Имена альтернатив там в одном порядке. Пишу функцию GetKind и вроде норм. Пока было нужно всего несколько раз, и руками было достаточно просто. Но вообще идея мне понравилась, и я подумал, как бы это дело сделать совместимым с std.

Захотелось:
1) поиметь функцию типа std::index (которой на самом деле вроде нет), которая для variant'а вызывает его index() и кастит к моему enum — что тут лучше придумать? Или есть что-то такое, просто я не в курсе?
2) аналог std::get. Кстати, я что-то всегда вызываю std::get, но, по идее, тут должен работать просто get через ADL, и я могу написать свою пачку перегрузок get в том же NS, где и variant, и всё будет работать просто через вызов get, так?
3) holds_alternative, которая принимает variantKind и variant, и возвращает bool — тут по идее, так же как с get
4) get_if — ну это уже на базе остального делается, вроде

Как это всё лучше по красоте сделать?

ЗЫ Думаю запилить какой-нить генератор кода, который бы мне всю красоту генерил по простецкому описанию, и мой Variant, и VariantKind

ЗЗЫ Приглашается в тему Евгений Музыченко с примером своего compile-time скрипта на его гипотетическом диалекте C++, в котором есть МАКРОСЫ. Каким ему видится решение подобной задачи? Хочу почитать код такого решения.

ЗЗЗЫ А как variant может стать value less? И как это можно продетектить? Это из-за исключений может получиться, или есть другие способы?
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.