# std::get (std::variant)

From cppreference.com
< cpp‎ | utility‎ | variant

Defined in header `<variant>` |  |
| (1) | (since C++17)
template <std::size_t I, class... Types> constexpr std::variant_alternative_t< I, std::variant<Types...> >& get(std::variant<Types...>& v); |  |
template <std::size_t I, class... Types> constexpr std::variant_alternative_t< I, std::variant<Types...> >&& get(std::variant<Types...>&& v); |  |
template <std::size_t I, class... Types> constexpr std::variant_alternative_t< I, std::variant<Types...> > const& get(const std::variant<Types...>& v); |  |
template <std::size_t I, class... Types> constexpr std::variant_alternative_t< I, std::variant<Types...> > const&& get(const std::variant<Types...>&& v); |  |
| (2) | (since C++17)
template <class T, class... Types> constexpr T& get(std::variant<Types...>& v); |  |
template <class T, class... Types> constexpr T&& get(std::variant<Types...>&& v); |  |
template <class T, class... Types> constexpr const T& get(const std::variant<Types...>& v); |  |
template <class T, class... Types> constexpr const T&& get(const std::variant<Types...>&& v); |  |

1) Index-based value accessor: If v.index() == I, returns a reference to the value stored in `v`. Otherwise, throws std::bad_variant_access. The call is ill-formed if `I` is not a valid index in the variant.
2) Type-based value accessor: If v holds the alternative `T`, returns a reference to the value stored in `v`. Otherwise, throws std::bad_variant_access. The call is ill-formed if `T` is not a unique element of `Types...`.

### Parameters

I | - | index to look up
Type | - | unique type to look up
v | - | a variant

### Return value

Reference to the value stored in the variant.

### Exceptions

1,2) Throws std::bad_variant_access on errors.

### Example

Run this code

    #include <variant>
    #include <string>

    int main()
    {
        std::variant<int, float> v{12}, w;
        int i = std::get<int>(v);
        w = std::get<int>(v);
        w = std::get<0>(v); // same effect as the previous line

    //  std::get<double>(v); // error: no double in [int, float]
    //  std::get<3>(v);      // error: valid index values are 0 and 1

        try {
          std::get<float>(w); // w contains int, not float: will throw
        }
        catch (std::bad_variant_access&) {}
    }

### See also

get_if (C++17) | obtains a pointer to the value of a pointed-to variant given the index or the type (if unique), returns null on error (function template)
std::get(std::tuple) | tuple accesses specified element (function template)
std::get(std::array) | accesses an element of an `array` (function template)
std::get(std::pair) (C++11) | accesses an element of a `pair` (function template)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/utility/variant/get&oldid=105608"