Namespaces
Variants

std:: get (std::tuple)

From cppreference.net
Utilities library
定义于头文件 <tuple>
template < std:: size_t I, class ... Types >

typename std:: tuple_element < I, std:: tuple < Types... >> :: type &

get ( std:: tuple < Types... > & t ) noexcept ;
(1) (C++11 起)
(C++14 起为 constexpr)
template < std:: size_t I, class ... Types >

typename std:: tuple_element < I, std:: tuple < Types... >> :: type &&

get ( std:: tuple < Types... > && t ) noexcept ;
(2) (C++11 起)
(C++14 起为 constexpr)
template < std:: size_t I, class ... Types >

const typename std:: tuple_element < I, std:: tuple < Types... >> :: type &

get ( const std:: tuple < Types... > & t ) noexcept ;
(3) (C++11 起)
(C++14 起为 constexpr)
template < std:: size_t I, class ... Types >

const typename std:: tuple_element < I, std:: tuple < Types... >> :: type &&

get ( const std:: tuple < Types... > && t ) noexcept ;
(4) (C++11 起)
(C++14 起为 constexpr)
template < class T, class ... Types >
constexpr T & get ( std:: tuple < Types... > & t ) noexcept ;
(5) (C++14 起)
template < class T, class ... Types >
constexpr T && get ( std:: tuple < Types... > && t ) noexcept ;
(6) (C++14 起)
template < class T, class ... Types >
constexpr const T & get ( const std:: tuple < Types... > & t ) noexcept ;
(7) (C++14 起)
template < class T, class ... Types >
constexpr const T && get ( const std:: tuple < Types... > && t ) noexcept ;
(8) (C++14 起)
1-4) 从元组中提取第 I th 个元素。 I 必须是位于 [ 0 , sizeof... ( Types ) ) 范围内的整数值。
5-8) 提取元组 t 中类型为 T 的元素。除非该元组中恰好有一个该类型的元素,否则编译失败。

目录

参数

t - 待提取内容的元组

返回值

t 中选定元素的引用。

注释

功能测试 标准 功能
__cpp_lib_tuples_by_type 201304L (C++14) 按类型访问元组 ( 5-8 )

示例

#include <cassert>
#include <iostream>
#include <string>
#include <tuple>
int main()
{
    auto x = std::make_tuple(1, "Foo", 3.14);
    // 基于索引的访问
    std::cout << "( " << std::get<0>(x)
              << ", " << std::get<1>(x)
              << ", " << std::get<2>(x)
              << " )\n";
    // 基于类型的访问(自 C++14 起)
    std::cout << "( " << std::get<int>(x)
              << ", " << std::get<const char*>(x)
              << ", " << std::get<double>(x)
              << " )\n";
    const std::tuple<int, const int, double, double> y(1, 2, 6.9, 9.6);
    const int& i1 = std::get<int>(y); // 正确:无歧义
    assert(i1 == 1);
    const int& i2 = std::get<const int>(y); // 正确:无歧义
    assert(i2 == 2);
    // const double& d = std::get<double>(y); // 错误:格式不正确(存在歧义)
    // 注意:可使用 std::tie 和结构化绑定
    // 将元组解包为独立对象
}

输出:

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

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

缺陷报告 适用范围 发布时行为 修正后行为
LWG 2485 C++11(按索引)
C++14(按类型)
缺少针对 const tuple && 的重载版本 已添加这些重载版本( ( 4 ) ( 8 )

参见

访问 array 的元素
(函数模板)
访问 pair 的元素
(函数模板)
通过索引或类型(若类型唯一)读取 variant 的值,错误时抛出异常
(函数模板)
std::ranges::subrange 获取迭代器或哨兵
(函数模板)
std::complex 获取实部或虚部的引用
(函数模板)
(C++11)
创建左值引用的 tuple 或将 tuple 解包为独立对象
(函数模板)
结构化绑定 (C++17) 将指定名称绑定到初始化器的子对象或 tuple 元素