Namespaces
Variants
Actions

std::extent

From cppreference.com
< cpp‎ | types
 
 
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
Type properties
(C++11)
(C++11)
(C++14)
(C++11)(deprecated in C++26)
(C++11)(until C++20*)
(C++11)(deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11)(deprecated in C++23)
(C++11)(deprecated in C++23)
(C++11)
(C++11)(until C++20*)(C++17)

Compile-time rational arithmetic
Compile-time integer sequences
 
Defined in header <type_traits>
template<class T, unsigned N =0>
struct extent;
(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 [0std::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.

Contents

[edit]Helper variable template

template<class T, unsigned N =0>
constexprstd::size_t extent_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_t
typestd::integral_constant<std::size_t, value>

[edit]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>{};

[edit]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(){constauto ext = std::extent<int['*']>{}; static_assert(ext ==42);// with implicit conversion to std::size_t   constint 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);}

[edit]See also

(C++11)
checks if a type is an array type
(class template)[edit]
(C++11)
obtains the number of dimensions of an array type
(class template)[edit]
removes one extent from the given array type
(class template)[edit]
removes all extents from the given array type
(class template)[edit]
(C++23)
a descriptor of a multidimensional index space of some rank
(class template)[edit]
close