types_extent

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::extentstd::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