tuple_get

tuple_get (튜플 요소 접근 함수)

이 페이지는 std::tuple의 요소를 인덱스나 타입으로 접근하는 std::get 함수 템플릿에 대해 설명해요. std::get은 컴파일 타임에 지정된 위치나 타입에 해당하는 요소의 참조를 반환하며, C++11부터 사용할 수 있어요. C++14부터는 타입 기반 접근과 constexpr 지원이 추가되었어요.

출처: cppreference

본문

<tuple> 헤더에 정의된 오버로드들은 다음과 같아요.

헤더에 정의됨
template < std :: size_t I , class ... Types > typename std :: tuple_element < I , std :: tuple < Types ... >>:: type & get ( std :: tuple < Types ... >& t ) noexcept ; (1) (since C++11) (constexpr since C++14)
template < std :: size_t I , class ... Types > typename std :: tuple_element < I , std :: tuple < Types ... >>:: type && get ( std :: tuple < Types ... >&& t ) noexcept ; (2) (since C++11) (constexpr since C++14)
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) (since C++11) (constexpr since C++14)
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) (since C++11) (constexpr since C++14)
template < class T , class ... Types > constexpr T & get ( std :: tuple < Types ... >& t ) noexcept ; (5) (since C++14)
template < class T , class ... Types > constexpr T && get ( std :: tuple < Types ... >&& t ) noexcept ; (6) (since C++14)
template < class T , class ... Types > constexpr const T & get ( const std :: tuple < Types ... >& t ) noexcept ; (7) (since C++14)
template < class T , class ... Types > constexpr const T && get ( const std :: tuple < Types ... >&& t ) noexcept ; (8) (since C++14)

매개변수 (Parameters)

t - 내용을 추출할 튜플

반환값 (Return value)

t의 선택된 요소에 대한 참조를 반환해요.

참고 (Notes)

기능 테스트 매크로 표준 기능
__cpp_lib_tuples_by_type 201304L (C++14) 타입으로 튜플에 접근 (5-8)

예제 (Example)

#include <cassert>
#include <print>
#include <string>
#include <tuple>
#include <type_traits>

int main()
{
    using Tuple = std::tuple<int, const char*, double>;
    auto x{std::make_tuple(42, "Foo", 3.14)};
    static_assert(std::is_same_v<Tuple, decltype(x)>);

    // Index-based access
    std::println("({}, {}, {})", std::get<0>(x), std::get<1>(x), std::get<2>(x));

    // Type-based access (since C++14)
    std::println("({}, {}, {})", std::get<int>(x),
                                 std::get<const char*>(x),
                                 std::get<double>(x));

    const std::tuple<int, const int, double, double> y(1, 2, 6.9, 9.6);
    const int& i1 = std::get<int>(y); // OK: not ambiguous
    assert(i1 == 1);
    const int& i2 = std::get<const int>(y); // OK: not ambiguous
    assert(i2 == 2);
    // const double& d = std::get<double>(y); // Error: ill-formed (ambiguous)

    // In addition to std::get, std::tie (C++11) and structured bindings (C++17)
    // can also be used to unpack a tuple into individual objects:
    int a;
    const char* b;
    double c;
    std::tie(a, b, c) = x;
    std::println("({}, {}, {})", a, b, c);

    auto& [d, e, f] = x;
    std::println("({}, {}, {})", d, e, f);
}

출력:

(42, Foo, 3.14)
(42, Foo, 3.14)
(42, Foo, 3.14)
(42, Foo, 3.14)

결함 보고서 (Defect reports)

다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었어요.

DR 적용 대상 공개된 동작 올바른 동작
LWG 2485 C++11 (인덱스 기준) C++14 (타입 기준) const tuple &&에 대한 오버로드가 없었음 이 오버로드들 ((4)와 (8))을 추가했음

같이 보기 (See also)

get (std::array) (C++11) 배열의 요소에 접근해요 (함수 템플릿) [edit]
get (std::pair) (C++11) pair의 요소에 접근해요 (함수 템플릿) [edit]
get (std::variant) (C++17) 인덱스나 타입(타입이 유일한 경우)으로 variant의 값을 읽고, 오류 시 예외를 던져요 (함수 템플릿) [edit]
get (std::ranges::subrange) (C++20) std::ranges::subrange에서 반복자 또는 센티널을 얻어요 (함수 템플릿) [edit]
get (std::complex) (C++26) std::complex에서 실수부 또는 허수부에 대한 참조를 얻어요 (함수 템플릿) [edit]
tie (C++11) lvalue 참조의 튜플을 만들거나 튜플을 개별 객체로 풀어요 (함수 템플릿) [edit]
Structured binding (C++17) 지정된 이름을 초기화자의 하위 객체나 튜플 요소에 바인딩해요 [edit]

더 알아보기 (Learn more)

cppreference