Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::extent(3)		      C++ Standard Libary		std::extent(3)

NAME
       std::extent - std::extent

Synopsis
	  Defined in header <type_traits>
	  template< class T, unsigned N	= 0>  (since C++11)
	  struct extent;

	  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.

	  The behavior of a program that adds specializations for extent
	  or extent_v
	  (since C++17)	is undefined.

	 Helper	variable template

	  template< class T, unsigned N	= 0 >				(since
       C++17)
	  inline constexpr std::size_t extent_v	= extent<T, N>::value;

       Inherited from std::integral_constant

Member constants
	  value	   the number of elements along	the Nth	dimension of T
	  [static] (public static member constant)

Member functions
	  operator std::size_t converts	the  object  to	 std::size_t,  returns
       value
			       (public member function)
	  operator()	       returns value
	  (C++14)	       (public member function)

Member types
	  Type	     Definition
	  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
       // Run this code

	#include <iostream>
	#include <type_traits>

	int main()
	{
	    std::cout  <<  std::extent<int[3]>::value << '\n'; //< default di-
       mension is 0
	    std::cout << std::extent<int[3][4],	0>::value << '\n';
	    std::cout << std::extent<int[3][4],	1>::value << '\n';
	    std::cout << std::extent<int[3][4],	2>::value << '\n';
	    std::cout << std::extent<int[]>::value << '\n';

	    const auto ext = std::extent<int[9]>{};
	    std::cout << ext <<	'\n'; //< implicit conversion to std::size_t

	    const int ints[] = {1,2,3,4};
	    std::cout << std::extent<decltype(ints)>::value << '\n'; //< array
       size

	    [[maybe_unused]] int ary[][3]={ {1,2,3} };

	    // ary[0] is type of reference of 'int[3]',	so, extent
	    // cannot calculate	correctly and return 0
	    static_assert(std::is_same_v<decltype(ary[0]), int(&)[3]>);
	    std::cout << std::extent<decltype(ary[0])>::value << '\n';
	    // removing	reference will give correct extent value 3
	    std::cout	       <<	   std::extent<std::remove_cvref_t<de-
       cltype(ary[0])>>::value << '\n';
	}

Output:
	3
	3
	4
	0
	0
	9
	4
	0
	3

See also
	  is_array	     checks if a type is an array type
	  (C++11)	     (class template)
	  rank		     obtains the number	of dimensions of an array type
	  (C++11)	     (class template)
	  remove_extent	     removes one extent	from the given array type
	  (C++11)	     (class template)
	  remove_all_extents removes all extents from the given	array type
	  (C++11)	     (class template)

http://cppreference.com		  2022.07.31			std::extent(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::extent&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help