std::variant provides the following access functions:
std::get_if: take pointer to variant, return pointer to alternative.
template <std::size_t I, typename... Ts>
auto* std::get_if(std::variant<Ts...>* pv) noexcept;
If
pvis not a null pointer andpv->index() == I, returns a pointer to the value stored in the variant pointed to bypv. Otherwise, returns a null pointer value.
This means that get_if's implementation roughly looks like this:
template <std::size_t I, typename... Ts>
auto* std::get_if(std::variant<Ts...>* pv) noexcept
{
if(pv == nullptr) return nullptr;
if(pv->index() != I) return nullptr;
return &(pv->real_get<I>());
}
std::get: take reference to variant, return reference to alternative, throw on invalid access.
template <std::size_t I, typename... Ts>
auto& std::get(std::variant<Ts...>& v);
If
v.index() == I, returns a reference to the value stored inv. Otherwise, throwsstd::bad_variant_access.
This means that get's implementation roughly looks like this:
template <std::size_t I, typename... Ts>
auto& std::get(std::variant<Ts...>& v)
{
if(v.index() != I) throw std::bad_variant_access{};
return v.real_get<I>();
}
I want an unsafe access function that:
Is noexcept.
Takes a reference to a variant, avoiding any pv == nullptr check.
Has undefined behavior if v.index() != I.
Why? Because there may be some situations where I am 100% sure that a particular variant instance contains a specific type in a code path. Also, it would be useful when writing generic code that already separately checked v.index() != I (e.g. writing my own visit).
Example implementation:
template <std::size_t I, typename... Ts>
auto& unsafe_get(std::variant<Ts...>& v)
{
return v.real_get<I>();
}
Is there something like this in the standard? I couldn't find it. If not, is this possible to implement for std::variant, or do I need to roll out my own variant implementation?
I think you have to implement the whole variant on your own. Though unrestricted unions can be helpful - they at least solve putting multiple types in the same location with alignment issue handled.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With