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.

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

	 Helper	variable template

	  template< class T >					 (since	C++17)
	  inline constexpr std::size_t rank_v =	rank<T>::value;

       Inherited from std::integral_constant

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 <iostream>
	#include <type_traits>

	int main()
	{
	    std::cout << std::rank<int>{} << "\n\n";

	    std::cout << std::rank<int[5]>{} <<	'\n';
	    std::cout << std::rank<int[5][5]>{}	<< '\n';
	    std::cout << std::rank<int[][5][5]>{} << '\n';

	    [[maybe_unused]] int ary[][3]={ {1,2,3} };
	    // The reason of rank of "ary[0]" is calculated as 0
	    std::cout << std::rank<decltype(ary[0])>::value << '\n';
	    // 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
	    std::cout		<<	     std::rank<std::remove_cvref_t<de-
       cltype(ary[0])>>::value << '\n';
	}

Output:
	0

	1
	2
	3
	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		  2022.07.31			  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.0>

home | help