tuple_get
tuple_get (튜플 요소 접근 함수)
이 페이지는 std::tuple의 요소를 인덱스나 타입으로 접근하는 std::get 함수 템플릿에 대해 설명해요. std::get은 컴파일 타임에 지정된 위치나 타입에 해당하는 요소의 참조를 반환하며, C++11부터 사용할 수 있어요. C++14부터는 타입 기반 접근과 constexpr 지원이 추가되었어요.
출처: cppreference
본문
<tuple> 헤더에 정의된 오버로드들은 다음과 같아요.
| template < std :: size_t I , class ... Types > typename std :: tuple_element < I , std :: tuple < Types ... >>:: type & get ( std :: tuple < Types ... >& t ) noexcept ; | (1) | (since C++11) (constexpr since C++14) |
| template < std :: size_t I , class ... Types > typename std :: tuple_element < I , std :: tuple < Types ... >>:: type && get ( std :: tuple < Types ... >&& t ) noexcept ; | (2) | (since C++11) (constexpr since C++14) |
| template < std :: size_t I , class ... Types > const typename std :: tuple_element < I , std :: tuple < Types ... >>:: type & get ( const std :: tuple < Types ... >& t ) noexcept ; | (3) | (since C++11) (constexpr since C++14) |
| template < std :: size_t I , class ... Types > const typename std :: tuple_element < I , std :: tuple < Types ... >>:: type && get ( const std :: tuple < Types ... >&& t ) noexcept ; | (4) | (since C++11) (constexpr since C++14) |
| template < class T , class ... Types > constexpr T & get ( std :: tuple < Types ... >& t ) noexcept ; | (5) | (since C++14) |
| template < class T , class ... Types > constexpr T && get ( std :: tuple < Types ... >&& t ) noexcept ; | (6) | (since C++14) |
| template < class T , class ... Types > constexpr const T & get ( const std :: tuple < Types ... >& t ) noexcept ; | (7) | (since C++14) |
| template < class T , class ... Types > constexpr const T && get ( const std :: tuple < Types ... >&& t ) noexcept ; | (8) | (since C++14) |
매개변수 (Parameters)
| t | - | 내용을 추출할 튜플 |
|---|
반환값 (Return value)
t의 선택된 요소에 대한 참조를 반환해요.
참고 (Notes)
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
| __cpp_lib_tuples_by_type | 201304L | (C++14) | 타입으로 튜플에 접근 (5-8) |
예제 (Example)
#include <cassert>
#include <print>
#include <string>
#include <tuple>
#include <type_traits>
int main()
{
using Tuple = std::tuple<int, const char*, double>;
auto x{std::make_tuple(42, "Foo", 3.14)};
static_assert(std::is_same_v<Tuple, decltype(x)>);
// Index-based access
std::println("({}, {}, {})", std::get<0>(x), std::get<1>(x), std::get<2>(x));
// Type-based access (since C++14)
std::println("({}, {}, {})", std::get<int>(x),
std::get<const char*>(x),
std::get<double>(x));
const std::tuple<int, const int, double, double> y(1, 2, 6.9, 9.6);
const int& i1 = std::get<int>(y); // OK: not ambiguous
assert(i1 == 1);
const int& i2 = std::get<const int>(y); // OK: not ambiguous
assert(i2 == 2);
// const double& d = std::get<double>(y); // Error: ill-formed (ambiguous)
// In addition to std::get, std::tie (C++11) and structured bindings (C++17)
// can also be used to unpack a tuple into individual objects:
int a;
const char* b;
double c;
std::tie(a, b, c) = x;
std::println("({}, {}, {})", a, b, c);
auto& [d, e, f] = x;
std::println("({}, {}, {})", d, e, f);
}
출력:
(42, Foo, 3.14)
(42, Foo, 3.14)
(42, Foo, 3.14)
(42, Foo, 3.14)
결함 보고서 (Defect reports)
다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었어요.
| DR | 적용 대상 | 공개된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2485 | C++11 (인덱스 기준) C++14 (타입 기준) | const tuple &&에 대한 오버로드가 없었음 |
이 오버로드들 ((4)와 (8))을 추가했음 |
같이 보기 (See also)
| get (std::array) (C++11) | 배열의 요소에 접근해요 (함수 템플릿) [edit] |
|---|---|
| get (std::pair) (C++11) | pair의 요소에 접근해요 (함수 템플릿) [edit] |
| get (std::variant) (C++17) | 인덱스나 타입(타입이 유일한 경우)으로 variant의 값을 읽고, 오류 시 예외를 던져요 (함수 템플릿) [edit] |
| get (std::ranges::subrange) (C++20) | std::ranges::subrange에서 반복자 또는 센티널을 얻어요 (함수 템플릿) [edit] |
| get (std::complex) (C++26) | std::complex에서 실수부 또는 허수부에 대한 참조를 얻어요 (함수 템플릿) [edit] |
| tie (C++11) | lvalue 참조의 튜플을 만들거나 튜플을 개별 객체로 풀어요 (함수 템플릿) [edit] |
| Structured binding (C++17) | 지정된 이름을 초기화자의 하위 객체나 튜플 요소에 바인딩해요 [edit] |