# std::get (std::variant)

< cpp‎ | utility‎ | variant

定义于头文件 `<variant>` |  |
| (1) | (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 const std::variant_alternative_t<I, std::variant<Types...>>& get( const std::variant<Types...>& v ); |  |
template< std::size_t I, class... Types > constexpr const std::variant_alternative_t<I, std::variant<Types...>>& get( const std::variant<Types...>&& v ); |  |
| (2) | (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) 基于下标的值访问器：若 v.index() == I ，则返回到存储于 `v` 的值的引用。否则抛出 std::bad_variant_access 。若 `I` 不是 `varian` 的合法下标，则此调用为病式。
2) 基于类型的值访问器：若 v 保有可选项 `T` ，则返回到存储于 `v` 的值的引用。否则抛出 std::bad_variant_access 。若 `T` 不是 `Types...` 中唯一存在的元素，则此调用为病式。

### 模板形参

I | - | 要查找的下标
T | - | 要查找的唯一类型
Types... | - | 构成 `variant` 的类型

### 参数

v | - | 一个 `variant`

### 返回值

到存储于 `variant` 中的值的引用。

### 异常

1,2) 错误时抛 std::bad_variant_access 。

### 示例

    #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); // 效果同前一行

    //  std::get<double>(v); // 错误： [int, float] 中无 double
    //  std::get<3>(v);      // 错误：合法的 index 值是 0 和 1

        try {
          std::get<float>(w); // w 含有 int ，非 float ：将抛出异常
        }
        catch (std::bad_variant_access&) {}
    }

### 参阅

get_if (C++17) | 以给定索引或类型（若其唯一），获得指向被指向的 variant 的值的指针，错误时返回空指针 (函数模板)
std::get(std::tuple) | 元组式访问指定的元素 (函数模板)
std::get(std::array) | 访问 `array` 的一个元素 (函数模板)
std::get(std::pair) (C++11) | 访问 `pair` 的一个元素 (函数模板)