pair_tuple_element

pair_tuple_element (pair용 tuple_element 특수화)

이 페이지는 std::pair에 대한 std::tuple_element의 부분 특수화를 다루고 있어요. 이 특수화를 사용하면 튜플과 유사한 문법으로 pair 요소의 타입을 컴파일 타임에 알아낼 수 있답니다. 만약 I >= 2라면 프로그램은 ill-formed로 처리돼요.

출처: cppreference

본문

<utility> 헤더에 정의되어 있어요.

<utility> 헤더에 정의됨
template < std :: size_t I , class T1 , class T2 > struct tuple_element < I , std :: pair < T1 , T2 >> ; (since C++11)

std::pair에 대한 std::tuple_element의 부분 특수화는 튜플과 유사한 문법을 사용하여 pair 요소의 타입에 컴파일 타임 접근을 제공해요. I >= 2인 경우 프로그램은 ill-formed가 돼요.

멤버 타입 (Member types)

멤버 타입 설명
type I == 0이면 T1, I == 1이면 T2

가능한 구현 (Possible implementation)

template < std :: size_t I , typename T > struct tuple_element ;
template < std :: size_t I , typename T1 , typename T2 > struct tuple_element < I , std :: pair < T1 , T2 >> {
    static_assert ( I < 2 , "std::pair has only 2 elements!" );
};
template < typename T1 , typename T2 > struct tuple_element < 0 , std :: pair < T1 , T2 >> {
    using type = T1 ;
};
template < typename T1 , typename T2 > struct tuple_element < 1 , std :: pair < T1 , T2 >> {
    using type = T2 ;
};

예제 (Example)

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

namespace detail
{
    template<std::size_t>
    struct index_tag { constexpr explicit index_tag() = default; };

    template<class T, class U>
    constexpr T get_val_dispatch(std::pair<T, U> const& pair, index_tag<0>)
    {
        return pair.first;
    }

    template<class T, class U>
    constexpr U get_val_dispatch(std::pair<T, U> const& pair, index_tag<1>)
    {
        return pair.second;
    }
} // namespace detail

template<std::size_t N, class T, class U>
auto constexpr get_val(std::pair<T, U> const& pair)
    -> typename std::tuple_element<N, std::pair<T, U>>::type
{
    return detail::get_val_dispatch(pair, detail::index_tag<N>{});
}

int main()
{
    auto var = std::make_pair(1, std::string{"one"});
    
    std::cout << get_val<0>(var) << " = " << get_val<1>(var);
}

출력:

1 = one

결함 보고 (Defect reports)

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

DR 적용 대상 기존 동작 올바른 동작
LWG 2974 C++11 범위를 벗어난 인덱스는 정의되지 않은 기본 템플릿을 참조했음 ill-formed로 처리됨 (하드 오류)

같이 보기 (See also)

구조적 바인딩 (C++17) 초기화자의 하위 객체나 튜플 요소에 지정된 이름을 바인딩해요 [edit]
tuple_element (C++11) 튜플 유사 타입의 요소 타입을 얻어요 (클래스 템플릿) [edit]
tuple_element (C++26) 튜플 유사 타입의 요소 타입 반사를 얻어요 (함수) [edit]
std::tuple_element std::tuple (C++11) 지정된 요소의 타입을 얻어요 (클래스 템플릿 특수화) [edit]
std::tuple_element std::array (C++11) 배열 요소의 타입을 얻어요 (클래스 템플릿 특수화) [edit]
std::tuple_element std::ranges::subrange (C++20) std::ranges::subrange의 반복자 또는 센티널 타입을 얻어요 (클래스 템플릿 특수화) [edit]
std::tuple_element std::complex (C++26) std::complex의 실수부와 허수부 타입을 얻어요 (클래스 템플릿 특수화) [edit]
std::tuple_size std::pair (C++11) pair의 크기를 얻어요 (클래스 템플릿 특수화) [edit]
get (std::pair) (C++11) pair의 요소에 접근해요 (함수 템플릿) [edit]

더 알아보기 (Learn more)

cppreference