std:: tuple_element
|
헤더에 정의됨
<tuple>
|
||
|
헤더에 정의됨
<array>
|
||
|
헤더에 정의됨
<utility>
|
||
|
헤더에 정의됨
<ranges>
|
(C++20부터)
|
|
|
헤더에 정의됨
<complex>
|
(C++26부터)
|
|
|
template
<
std::
size_t
I,
class
T
>
struct tuple_element ; // 정의되지 않음 |
(1) | (C++11부터) |
|
template
<
std::
size_t
I,
class
T
>
struct
tuple_element
<
I,
const
T
>
{
|
(2) | (C++11부터) |
|
template
<
std::
size_t
I,
class
T
>
struct
tuple_element
<
I,
volatile
T
>
{
|
(3) |
(C++11부터)
(C++20부터 사용 중단됨) |
|
template
<
std::
size_t
I,
class
T
>
struct
tuple_element
<
I,
const
volatile
T
>
{
|
(4) |
(C++11부터)
(C++20부터 사용 중단됨) |
튜플-라이크(tuple-like) 타입의 요소들의 타입들에 컴파일 타임 인덱스 접근을 제공합니다.
|
|
(C++17부터) |
목차 |
특수화
표준 라이브러리는 표준 라이브러리 타입에 대해 다음과 같은 특수화를 제공합니다:
|
(C++11)
|
지정된 요소의 타입을 얻음
(클래스 템플릿 특수화) |
|
(C++11)
|
pair
요소들의 타입을 얻음
(클래스 템플릿 특수화) |
|
(C++11)
|
array
요소들의 타입을 얻음
(클래스 템플릿 특수화) |
|
std::ranges::subrange
의 반복자 또는 센티넬 타입을 얻음
(클래스 템플릿 특수화) |
|
|
std::complex
의 기저 실수 및 허수 숫자 타입을 얻음
(클래스 템플릿 특수화) |
사용자는 프로그램 정의 타입에 대해
std::tuple_element
를 특수화하여 튜플과 유사하게 만들 수 있습니다.
일반적인 경우에서
get
함수가 참조 멤버나 하위 객체에 대한 참조를 반환할 때, cv-unqualified 타입에 대한 특수화만 사용자 정의하면 됩니다.
멤버 타입
| 멤버 타입 | 정의 |
| type |
표준 특수화의 경우,
I
번째
요소의 타입으로,
튜플-유사
타입
T
의
I
가
[
0
,
std::
tuple_size
<
T
>
::
value
)
범위 내에 있음
|
헬퍼 타입
|
헤더 파일에 정의됨
<tuple>
|
||
|
template
<
std::
size_t
I,
class
T
>
using tuple_element_t = typename tuple_element < I, T > :: type ; |
(C++14부터) | |
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_tuple_element_t
|
201402L
|
(C++14) |
std::tuple_element_t
|
예제
#include <array> #include <cstddef> #include <iostream> #include <ranges> #include <tuple> #include <type_traits> #include <utility> template<typename T1, typename T2, typename T3> struct Triple { T1 t1; T2 t2; T3 t3; }; // 프로그램 정의 타입 Triple에 대한 std::tuple_element의 특수화: template<std::size_t I, typename T1, typename T2, typename T3> struct std::tuple_element<I, Triple<T1, T2, T3>> { static_assert(false, "잘못된 인덱스"); }; template<typename T1, typename T2, typename T3> struct std::tuple_element<0, Triple<T1, T2, T3>> { using type = T1; }; template<typename T1, typename T2, typename T3> struct std::tuple_element<1, Triple<T1, T2, T3>> { using type = T2; }; template<typename T1, typename T2, typename T3> struct std::tuple_element<2, Triple<T1, T2, T3>> { using type = T3; }; template<typename... Args> struct TripleTypes { static_assert(3 == sizeof...(Args), "정확히 3개의 타입 이름이 필요합니다"); template<std::size_t N> using type = typename std::tuple_element_t<N, Triple<Args...>>; }; int main() { TripleTypes<char, int, float>::type<1> i{42}; std::cout << i << '\n'; using Tri = Triple<int, char, short>; //< 프로그램 정의 타입 static_assert(std::is_same_v<std::tuple_element_t<0, Tri>, int> && std::is_same_v<std::tuple_element_t<1, Tri>, char> && std::is_same_v<std::tuple_element_t<2, Tri>, short>); using Tuple = std::tuple<int, char, short>; static_assert(std::is_same_v<std::tuple_element_t<0, Tuple>, int> && std::is_same_v<std::tuple_element_t<1, Tuple>, char> && std::is_same_v<std::tuple_element_t<2, Tuple>, short>); using Array3 = std::array<int, 3>; static_assert(std::is_same_v<std::tuple_element_t<0, Array3>, int> && std::is_same_v<std::tuple_element_t<1, Array3>, int> && std::is_same_v<std::tuple_element_t<2, Array3>, int>); using Pair = std::pair<Tuple, Tri>; static_assert(std::is_same_v<std::tuple_element_t<0, Pair>, Tuple> && std::is_same_v<std::tuple_element_t<1, Pair>, Tri>); using Sub = std::ranges::subrange<int*, int*>; static_assert(std::is_same_v<std::tuple_element_t<0, Sub>, int*> && std::is_same_v<std::tuple_element_t<1, Sub>, int*>); }
출력:
42
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2212 | C++11 | cv 타입에 대한 특수화가 일부 헤더에서 요구되지 않아 모호성이 발생함 | 요구됨 |
참고 항목
| Structured binding (C++17) | 지정된 이름들을 초기화자의 부분 객체나 튜플 요소에 바인딩합니다 |
|
(C++11)
|
튜플과 유사한 타입의 요소 개수를 얻습니다
(클래스 템플릿) |
|
(C++11)
|
임의 개수의 튜플들을 연결하여
tuple
을 생성합니다
(함수 템플릿) |