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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::rank - std::rank

Synopsis
	  Defined in header <type_traits>
	  template< class T >		   (since C++11)
	  struct rank;

	  If  T	 is an array type, provides the	member constant	value equal to
       the number of
	  dimensions of	the array. For any other type, value is	0.

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

Member constants
	  value	   the number of dimensions of T or zero
	  [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>
	  struct rank :	public std::integral_constant<std::size_t, 0> {};

	  template<class T>
	  struct   rank<T[]>   :   public  std::integral_constant<std::size_t,
       rank<T>::value +	1> {};

	  template<class T, std::size_t	N>
	  struct  rank<T[N]>  :	  public   std::integral_constant<std::size_t,
       rank<T>::value +	1> {};

Example
       // Run this code

	#include <type_traits>

	int main()
	{
	    static_assert(
		    std::rank<int>{} ==	0
		&&  std::rank<int[5]>{}	== 1
		&&  std::rank<int[5][5]>{} == 2
		&&  std::rank<int[][5][5]>{} ==	3 );

	    [[maybe_unused]] int ary[][3] = {{1, 2, 3}};
	    // The reason of rank of "ary[0]" is calculated as 0
	    static_assert(std::rank_v<decltype(ary[0])>	== 0);
	    // is that rank cannot deal	with reference type. i.e. int(&)[3]
	    static_assert(std::is_same_v<decltype(ary[0]), int(&)[3]>);
	    // The solution is to remove reference type
	    static_assert(std::rank_v<std::remove_cvref_t<decltype(ary[0])>>
       == 1);
	}

See also
	  is_array	     checks if a type is an array type
	  (C++11)	     (class template)
	  extent	      obtains the size of an array type	along a	speci-
       fied dimension
	  (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		  2024.06.10			  std::rank(3)

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

home | help