Код: Выделить всё
std::variant< /code> предоставляет следующие функции доступа: < /p>
[list]
[*] std::get_if
Код: Выделить всё
template
auto* std::get_if(std::variant* pv) noexcept;
< /code>
Если pv < /code> не является нулевым указателем, а pv-> index () == i < /code>, возвращает указатель на значение, хранящееся в варианте, указанном на pv < /code>. В противном случае возвращает значение нуля.template
auto* std::get_if(std::variant* pv) noexcept
{
if(pv == nullptr) return nullptr;
if(pv->index() != I) return nullptr;
return &(pv->real_get());
}
[*]
Код: Выделить всё
std::get
Код: Выделить всё
throw
Код: Выделить всё
template
auto& std::get(std::variant& v);
< /code>
if v.index () == i < /code>, возвращает ссылку на значение, хранящееся в v < /code>. В противном случае, бросает std :: bad_variant_access < /code>. < /P>
< /blockquote>
Это означает, что реализация Get < /code> примерно выглядит так: < /p>
template
auto& std::get(std::variant& v)
{
if(v.index() != I) throw std::bad_variant_access{};
return v.real_get();
}
< /code> < /li>
< /ul> < /li>
< /ul>
[b] Я хочу небезопасную функцию доступа: < /strong> < /p>
< /p>. /> принимает reference к варианту
имеет undefined birth if v.index ()! = I . Потому что могут быть некоторые ситуации, когда я на 100% уверен, что конкретный вариант экземпляр содержит определенный тип в пути кода. Кроме того, было бы полезно при написании общего кода, который уже отдельно проверял v.index ()! = I (например, написание моего собственного посещения ) .
Пример реализация:
Код: Выделить всё
template
auto& unsafe_get(std::variant& v)
{
return v.real_get();
}
< /code>
есть ли что -то подобное в стандарте? < /strong> я не смог его найти. Если нет, то может ли это реализовать для std :: variant
Подробнее здесь: https://stackoverflow.com/questions/420 ... stdvariant