# std::get(std::tuple)

< cpp‎ | utility‎ | tuple

定义于头文件 `<tuple>` |  |
template< std::size_t I, class... Types > typename std::tuple_element<I, tuple<Types...> >::type& get( tuple<Types...>& t ) noexcept; | (1) | (C++11 起) (C++14 起为 `constexpr`)
template< std::size_t I, class... Types > typename std::tuple_element<I, tuple<Types...> >::type&& get( tuple<Types...>&& t ) noexcept; | (2) | (C++11 起) (C++14 起为 `constexpr`)
template< std::size_t I, class... Types > typename std::tuple_element<I, tuple<Types...> >::type const& get( const tuple<Types...>& t ) noexcept; | (3) | (C++11 起) (C++14 起为 `constexpr`)
template< std::size_t I, class... Types > typename std::tuple_element<I, tuple<Types...> >::type const&& get( const tuple<Types...>&& t ) noexcept; | (4) | (C++11 起) (C++14 起为 `constexpr`)
template< class T, class... Types > constexpr T& get(tuple<Types...>& t) noexcept; | (5) | (C++14 起)
template< class T, class... Types > constexpr T&& get(tuple<Types...>&& t) noexcept; | (6) | (C++14 起)
template< class T, class... Types > constexpr const T& get(const tuple<Types...>& t) noexcept; | (7) | (C++14 起)
template< class T, class... Types > constexpr const T&& get(const tuple<Types...>&& t) noexcept; | (8) | (C++14 起)

1-4) 从 tuple 提取第 `I` 个元素。 `I` 是 `[0, sizeof...(Types))` 中的整数值。
5-8) 提取 tuple `t` 的类型为 `T` 的元素。若 tuple 不恰好拥有一个该类型元素则编译失败。

### 参数

t | - | 要提取内容的 tuple

### 返回值

到 `t` 的被选中元素的引用。

### 示例

    #include <iostream>
    #include <string>
    #include <tuple>

    int main()
    {
        auto t = std::make_tuple(1, "Foo", 3.14);
        // 基于下标的访问
        std::cout << "(" << std::get<0>(t) << ", " << std::get<1>(t)
                  << ", " << std::get<2>(t) << ")\n";
        // 基于类型的访问（ C++14 起）
        std::cout << "(" << std::get<int>(t) << ", " << std::get<const char*>(t)
                  << ", " << std::get<double>(t) << ")\n";
        // 注意： std::tie 和结构化绑定亦可用于分解 tuple
    }

输出：

    (1, Foo, 3.14)
    (1, Foo, 3.14)

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 2485 | C++11 （按索引） C++14 （按类型） | 无对于 const tuple&& 的重载 | 添加重载

### 参阅

结构化绑定 (C++17) | 绑定指定的名字到初始化器的子对象或元组元素
std::get(std::array) | 访问 `array` 的一个元素 (函数模板)
std::get(std::pair) (C++11) | 访问 `pair` 的一个元素 (函数模板)
std::get(std::variant) (C++17) | 以给定索引或类型（若类型唯一）读取 `variant` 的值，错误时抛出异常 (函数模板)