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] |