array::get
array::get (tuple처럼 원소 꺼내기)
std::array를 tuple 인터페이스처럼 다뤄서, 컴파일 타임 상수 인덱스 I번째 원소의 참조를 돌려주는 함수 템플릿이에요. get<I>(a) 형태로 써서 배열의 특정 위치 원소를 안전하게 가져올 수 있어요. C++11부터 있어요.
출처: cppreference
본문
get은 <array> 헤더에 정의돼 있고, 표준 라이브러리가 tuple 같은 인터페이스와 함께 동작하도록 해줘요. std::array는 아니지만 std::tuple과 비슷하게 get<0>(a) 같은 문법을 지원해요.
template< std::size_t I, class T, std::size_t N >
T& get( std::array<T,N>& a ) noexcept; // (1)
template< std::size_t I, class T, std::size_t N >
T&& get( std::array<T,N>&& a ) noexcept; // (2)
template< std::size_t I, class T, std::size_t N >
const T& get( const std::array<T,N>& a ) noexcept; // (3)
template< std::size_t I, class T, std::size_t N >
const T&& get( const std::array<T,N>&& a ) noexcept; // (4)
배열에서 I번째 원소를 tuple 같은 인터페이스로 추출해요. I는 [0, N) 범위의 정수값이어야 하고, at()이나 operator[]와 달리 이 검사는 컴파일 타임에 이뤄져요. 그래서 범위를 벗어난 인덱스를 쓰면 컴파일 자체가 실패해요.
- 매개변수
a: 내용물을 추출할 배열이에요. - 반환 값: 배열
a의I번째 원소에 대한 참조예요. - 복잡도: 상수 시간이에요.
C++14부터는 constexpr로 지정돼서 컴파일 타임 계산에도 쓸 수 있어요. 문자열 리터럴에서 std::get을 직접 쓰는 일은 없지만, 구조적 바인딩(structured binding)이나 일반화된 코드에서 자주 등장해요.
예제를 보면 constexpr 배열에서도 get이 잘 동작하는 걸 확인할 수 있어요.
#include <array>
#include <iostream>
constexpr std::array v{1, 2, 3};
static_assert(get<0>(v) == 1 && get<1>(v) == 2 && get<2>(v) == 3);
int main()
{
std::array<int, 3> a;
// 값 설정:
get<0>(a) = 1, get<1>(a) = 2, get<2>(a) = 3;
// 값 읽기:
std::cout << '(' << get<0>(a) << ',' << get<1>(a) << ',' << get<2>(a) << ")\n";
}
출력은 (1,2,3)이에요.
결함 보고(defect report)도 있었어요. LWG 2485에 따라 C++11에서 const array&&에 대한 오버로드가 없던 문제가 수정돼서, 나중에 해당 오버로드가 추가됐어요.