Namespaces
Variants

std:: tuple

From cppreference.net
Utilities library
헤더에 정의됨 <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을 개별 객체들로 풀어냄
(함수 템플릿)
전달 참조 들의 tuple 을 생성함
(함수 템플릿)
(C++11)
임의의 개수의 tuple들을 연결하여 tuple 을 생성함
(함수 템플릿)
tuple의 지정된 요소에 접근함
(함수 템플릿)
(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
tuple 내의 값들을 사전식으로 비교함
(함수 템플릿)
std::swap 알고리즘을 특수화함
(함수 템플릿)

헬퍼 개념

어떤 타입이 tuple 프로토콜 을 구현했음을 명시함
( std::get , std::tuple_element , std::tuple_size )
( 설명 전용 개념* )

헬퍼 클래스

tuple 의 크기를 구함


(클래스 템플릿 특수화)

지정된 요소의 타입을 구함
(클래스 템플릿 특수화)
std::uses_allocator 타입 특질을 특수화함
(클래스 템플릿 특수화)
tuple tuple-like 타입의 공통 참조 타입을 결정함
(클래스 템플릿 특수화)
tuple tuple-like 타입의 공통 타입을 결정함
(클래스 템플릿 특수화)
tuple 에 대한 포맷팅 지원
(클래스 템플릿 특수화)
(C++11)
tie 를 사용하여 tuple 을 언패킹할 때 요소를 건너뛰기 위한 플레이스홀더
(상수)

헬퍼 특수화

template < class ... Ts >

constexpr bool enable_nonlocking_formatter_optimization < std :: tuple < Ts... >>

= ( enable_nonlocking_formatter_optimization < 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항 튜플, 즉 두 값의 쌍을 구현합니다
(클래스 템플릿)