types_extent (배열의 차원 크기 조회)
이 페이지는 C++ 표준 라이브러리의 std::extent 템플릿에 대해 설명해요. std::extent는 배열 타입의 특정 차원에 있는 요소 개수를 컴파일 타임에 알아내는 데 사용돼요. 이 값을 통해 배열의 크기나 다차원 배열의 각 차원 길이를 상수 표현식으로 얻을 수 있어요.
출처: cppreference
본문
<type_traits> 헤더에 정의되어 있어요.
Defined in header <type_traits> |
|
|
template < class T , unsigned N = 0 > struct extent ; |
|
(since C++11) |
T가 배열 타입이라면, N이 [0, std::rank<T>::value) 범위에 있을 때, 배열의 N번째 차원에 있는 요소 개수와 같은 멤버 상수 value를 제공해요. 다른 모든 타입이거나, T가 첫 번째 차원의 크기를 알 수 없는 배열이고 N이 0이라면 value는 0이에요.
프로그램이 std::extent나 std::extent_v(C++17 이후)에 대해 특수화를 추가하면 동작이 정의되지 않아요.
Helper variable template
template < class T , unsigned N = 0 > constexpr std :: size_t extent_v = extent < T , N >:: value ; |
|
(since C++17) |
std::integral_constant에서 상속됨
Member constants
value [static] |
T의 N번째 차원에 있는 요소 개수 (공용 정적 멤버 상수) |
Member functions
operator std::size_t |
객체를 std::size_t로 변환하고 value를 반환해요 (공용 멤버 함수) |
operator() (C++14) |
value를 반환해요 (공용 멤버 함수) |
Member types
| 타입 |
정의 |
value_type |
std::size_t |
type |
std::integral_constant<std::size_t, value> |
가능한 구현 (Possible implementation)
template < class T , unsigned N = 0 > struct extent : std :: integral_constant < std :: size_t , 0 > {}; template < class T > struct extent < T [], 0 > : std :: integral_constant < std :: size_t , 0 > {}; template < class T , unsigned N > struct extent < T [], N > : std :: extent < T , N - 1 > {}; template < class T , std :: size_t I > struct extent < T [ I ], 0 > : std :: integral_constant < std :: size_t , I > {}; template < class T , std :: size_t I , unsigned N > struct extent < T [ I ], N > : std :: extent < T , N - 1 > {};
예제 (Example)
#include <type_traits>
static_assert(
std::extent_v<int[3]> == 3 && // default dimension is 0
std::extent_v<int[3], 0> == 3 && // the same as above
std::extent_v<int[3][4], 0> == 3 &&
std::extent_v<int[3][4], 1> == 4 &&
std::extent_v<int[3][4], 2> == 0 &&
std::extent_v<int[]> == 0
);
int main()
{
const auto ext = std::extent<int['*']>{};
static_assert(ext == 42); // with implicit conversion to std::size_t
const int ints[]{1, 2, 3, 4};
static_assert(std::extent_v<decltype(ints)> == 4); // array size
[[maybe_unused]] int ary[][3] = {{1, 2, 3}};
// ary[0] is of type reference to 'int[3]', so, the extent
// cannot be calculated correctly and it returns 0
static_assert(std::is_same_v<decltype(ary[0]), int(&)[3]>);
static_assert(std::extent_v<decltype(ary[0])> == 0);
// removing reference gives correct extent value 3
static_assert(std::extent_v<std::remove_cvref_t<decltype(ary[0])>> == 3);
}
같이 보기 (See also)
is_array (C++11) |
타입이 배열 타입인지 확인해요 (클래스 템플릿) [편집] |
rank (C++11) |
배열 타입의 차원 수를 얻어요 (클래스 템플릿) [편집] |
remove_extent (C++11) |
주어진 배열 타입에서 한 차원을 제거해요 (클래스 템플릿) [편집] |
remove_all_extents (C++11) |
주어진 배열 타입에서 모든 차원을 제거해요 (클래스 템플릿) [편집] |
extents (C++23) |
어떤 rank를 가진 다차원 인덱스 공간의 설명자예요 (클래스 템플릿) [편집] |
extent (C++26) |
반영된 배열 타입의 지정된 차원 크기를 얻어요 (함수) [편집] |
더 알아보기 (Learn more)
cppreference