std:: tuple
|
헤더에 정의됨
<tuple>
|
||
|
template
<
class
...
Types
>
class tuple ; |
(C++11부터) | |
클래스 템플릿
std::tuple
는 이종(heterogeneous) 값들의 고정된 크기 컬렉션입니다. 이것은
std::pair
의 일반화입니다.
만약
std::
is_trivially_destructible
<
Ti
>
::
value
가
Types
내의 모든
Ti
에 대해
true
라면,
std::tuple
의 소멸자는 trivial합니다.
프로그램이 explicit 또는 partial 전문화를 선언하는 경우, 해당 프로그램은 진단 없이 잘못된 형식입니다.
목차 |
템플릿 매개변수
| Types... | - | 튜플이 저장하는 요소들의 타입들. 빈 목록이 지원됩니다. |
멤버 함수
새로운
tuple
을 생성함
(public member function) |
|
한
tuple
의 내용을 다른
tuple
에 할당함
(public member function) |
|
두
tuple
의 내용을 교환함
(public member function) |
비멤버 함수
|
(C++11)
|
인자 타입들로 정의된 타입의
tuple
객체를 생성함
(함수 템플릿) |
|
(C++11)
|
lvalue 참조들의
tuple
을 생성하거나 tuple을 개별 객체들로 풀어냄
(함수 템플릿) |
|
(C++11)
|
전달 참조
들의
tuple
을 생성함
(함수 템플릿) |
|
(C++11)
|
임의의 개수의 tuple들을 연결하여
tuple
을 생성함
(함수 템플릿) |
|
(C++11)
|
tuple의 지정된 요소에 접근함
(함수 템플릿) |
|
(C++20에서 제거됨)
(C++20에서 제거됨)
(C++20에서 제거됨)
(C++20에서 제거됨)
(C++20에서 제거됨)
(C++20)
|
tuple 내의 값들을 사전식으로 비교함
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
헬퍼 개념
|
(C++23)
|
어떤 타입이
tuple 프로토콜
을 구현했음을 명시함
( std::get , std::tuple_element , std::tuple_size ) ( 설명 전용 개념* ) |
헬퍼 클래스
|
(C++11)
|
tuple
의 크기를 구함
|
|
(C++11)
|
지정된 요소의 타입을 구함
(클래스 템플릿 특수화) |
|
(C++11)
|
std::uses_allocator
타입 특질을 특수화함
(클래스 템플릿 특수화) |
tuple
과
tuple-like
타입의 공통 참조 타입을 결정함
(클래스 템플릿 특수화) |
|
|
(C++23)
|
tuple
과
tuple-like
타입의 공통 타입을 결정함
(클래스 템플릿 특수화) |
|
(C++23)
|
tuple
에 대한 포맷팅 지원
(클래스 템플릿 특수화) |
|
(C++11)
|
tie
를 사용하여
tuple
을 언패킹할 때 요소를 건너뛰기 위한 플레이스홀더
(상수) |
헬퍼 특수화
|
template
<
class
...
Ts
>
constexpr
bool
enable_nonlocking_formatter_optimization
<
std
::
tuple
<
Ts...
>>
|
(C++23부터) | |
std::enable_nonlocking_formatter_optimization
의 이 특수화는 각 요소 타입이 이를 활성화한 경우
tuple
객체를 출력하기 위한
std::print
및
std::println
의 효율적인 구현을 가능하게 합니다.
추론 가이드 (C++17부터)
참고 사항
튜플의 "형상" – 즉 크기, 요소들의 타입, 그리고 그 타입들의 순서 – 은 타입 시그니처의 일부이므로, 이들은 모두 컴파일 타임에 사용 가능해야 하며 다른 컴파일 타임 정보에만 의존할 수 있습니다. 이는 튜플에 대한 많은 조건부 연산 – 특히 조건부 앞쪽 추가/뒤쪽 추가 및 필터링 – 은 조건들이 컴파일 타임에 평가될 수 있는 경우에만 가능함을 의미합니다. 예를 들어, 주어진 std :: tuple < int , double , int > 에 대해, 타입 기반 필터링 – 예를 들어 std :: tuple < int , int > 반환 – 은 가능하지만, 각 요소가 양수인지 여부에 따른 필터링(이는 튜플의 런타임 값에 따라 다른 타입 시그니처를 가짐)은 모든 요소들이 자체적으로 constexpr 가 아닌 한 불가능합니다.
해결 방법으로, std:: optional 의 튜플을 사용하여 작업할 수 있지만, 런타임 정보를 기반으로 크기를 조정할 수 있는 방법은 여전히 존재하지 않습니다.
N4387 (C++11용 결함 보고서로 적용됨) 이전까지는 함수가 copy-list-initialization을 사용하여 튜플을 반환할 수 없었습니다:
std::tuple<int, int> foo_tuple() { return {1, -1}; // N4387 이전까지 오류 return std::tuple<int, int>{1, -1}; // 항상 동작 return std::make_tuple(1, -1); // 항상 동작 }
예제
#include <iostream> #include <stdexcept> #include <string> #include <tuple> std::tuple<double, char, std::string> get_student(int id) { switch (id) { case 0: return {3.8, 'A', "Lisa Simpson"}; case 1: return {2.9, 'C', "Milhouse Van Houten"}; case 2: return {1.7, 'D', "Ralph Wiggum"}; case 3: return {0.6, 'F', "Bart Simpson"}; } throw std::invalid_argument("id"); } int main() { const auto student0 = get_student(0); std::cout << "ID: 0, " << "GPA: " << std::get<0>(student0) << ", " << "grade: " << std::get<1>(student0) << ", " << "name: " << std::get<2>(student0) << '\n'; const auto student1 = get_student(1); std::cout << "ID: 1, " << "GPA: " << std::get<double>(student1) << ", " << "grade: " << std::get<char>(student1) << ", " << "name: " << std::get<std::string>(student1) << '\n'; double gpa2; char grade2; std::string name2; std::tie(gpa2, grade2, name2) = get_student(2); std::cout << "ID: 2, " << "GPA: " << gpa2 << ", " << "grade: " << grade2 << ", " << "name: " << name2 << '\n'; // C++17 structured binding: const auto [gpa3, grade3, name3] = get_student(3); std::cout << "ID: 3, " << "GPA: " << gpa3 << ", " << "grade: " << grade3 << ", " << "name: " << name3 << '\n'; }
출력:
ID: 0, GPA: 3.8, grade: A, name: Lisa Simpson ID: 1, GPA: 2.9, grade: C, name: Milhouse Van Houten ID: 2, GPA: 1.7, grade: D, name: Ralph Wiggum ID: 3, GPA: 0.6, grade: F, name: Bart Simpson
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2796 | C++11 |
std::tuple
의 소멸자 트리비얼리티가 명시되지 않음
|
명시됨 |
| LWG 3990 | C++11 |
프로그램이
std::tuple
의 명시적 또는
부분 특수화를 선언할 수 있었음 |
이 경우 프로그램은 형식 오류
(진단 메시지 불필요) |
참고문헌
- C++23 표준 (ISO/IEC 14882:2024):
-
- 22.4 튜플 [tuple]
- C++20 표준 (ISO/IEC 14882:2020):
-
- 20.5 튜플 [tuple]
- C++17 표준(ISO/IEC 14882:2017):
-
- 23.5 튜플 [tuple]
- C++14 표준(ISO/IEC 14882:2014):
-
- 20.4 튜플 [tuple]
- C++11 표준 (ISO/IEC 14882:2011):
-
- 20.4 튜플 [tuple]
참고 항목
|
2항 튜플, 즉 두 값의 쌍을 구현합니다
(클래스 템플릿) |