std::extent - cppreference.com

From cppreference.com

template<classT,unsignedN=0>structextent;(since C++11)If T is an array type, provides the member constant value equal to the number of elements along the Nth dimension of the array, if N is in [0, std::rank<T>::value). For any other type, or if T is an array of unknown bound along its first dimension and N is 0, value is 0.

If the program adds specializations for std::extent or std::extent_v(since C++17), the behavior is undefined.

Helper variable template

template<classT,unsignedN=0>constexprstd::size_textent_v=extent<T,N>::value;(since C++17)Inherited from

std::integral_constant

Member constants

value

[static]

the number of elements along the Nth dimension of T
(public static member constant)Member functions

operator std::size_t

converts the object to std::size_t, returns value
(public member function)operator()

(C++14)

returns value
(public member function)Member types

Type Definition value_typestd::size_ttypestd::integral_constant<std::size_t,value>Possible implementation

template<classT,unsignedN=0>structextent:std::integral_constant<std::size_t,0>{};template<classT>structextent<T[],0>:std::integral_constant<std::size_t,0>{};template<classT,unsignedN>structextent<T[],N>:std::extent<T,N-1>{};template<classT,std::size_tI>structextent<T[I],0>:std::integral_constant<std::size_t,I>{};template<classT,std::size_tI,unsignedN>structextent<T[I],N>:std::extent<T,N-1>{};Example

Run this code

#include<type_traits>static_assert(std::extent_v<int[3]>==3&&// default dimension is 0std::extent_v<int[3],0>==3&&// the same as abovestd::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);intmain(){constautoext=std::extent<int['*']>{};static_assert(ext==42);// with implicit conversion to std::size_tconstintints[]{1,2,3,4};static_assert(std::extent_v<decltype(ints)>==4);// array size[[maybe_unused]]intary[][3]={{1,2,3}};// ary[0] is of type reference to 'int[3]', so, the extent// cannot be calculated correctly and it returns 0static_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 3static_assert(std::extent_v<std::remove_cvref_t<decltype(ary[0])>>==3);}See also

is_array

(C++11)

checks if a type is an array type
(class template)

[edit]

rank

(C++11)

obtains the number of dimensions of an array type
(class template)

[edit]

remove_extent

(C++11)

removes one extent from the given array type
(class template)

[edit]

remove_all_extents

(C++11)

removes all extents from the given array type
(class template)

[edit]

extents

(C++23)

a descriptor of a multidimensional index space of some rank
(class template)

[edit]

extent

(C++26)

obtains the size of reflected array type along a specified dimension
(function)

[edit]