1

I just ran into std::rank and I don't really understand what it could be used for. I understand what it does, but can someone please give me a few use cases for it? I wasn't able to find anything useful on a search here.

max66
  • 65,235
  • 10
  • 71
  • 111
Xzenon
  • 1,193
  • 2
  • 15
  • 37
  • Its main use is probably in template metaprogramming, but it'll largely vary depending on your needs (that we can't guess). – edmz Apr 26 '16 at 20:39

1 Answers1

1

Nice question.

I'm trying to learn C++11, so I could write something silly but ... suppose you want find the maximum value in a multidimensional array.

I tried to answer this question with std::rank (and SFINAE)

#include <iterator>
#include <iostream>
#include <type_traits>

template <typename X,
          typename = typename std::enable_if<0U == std::rank<X>::value>::type>
  X maxRank (X const & x)
 { return x; }

template <typename X,
          typename = typename std::enable_if<0U != std::rank<X>::value>::type>
typename std::remove_all_extents<X>::type maxRank (X const & x)
 {
   auto  it  = std::begin(x);
   auto  ret = maxRank(*it);

   for ( ; it != std::end(x) ; ++it )
    {
      auto val = maxRank(*it);

      if ( val > ret )
         ret = val;
    }

   return ret;
 }


int main ()
 {
   int  a0 = 12; 
   short a1[] = { 23, 7, 42, -19, 0, 95 };
   unsigned  a2[][2] = { {8U, 9U}, {0U, 77U}, {11U, 9U}, {5U, 3U} };
   long  a3[][3][2] = { { {123L, 3L}, {-45L, 77L}, {-12L, 678L} },
                        { {1L, -54L}, {23L, 99L}, {56L, 1234L} },
                        { {-4L, -12L}, {1L, 0L}, {122L, 19L} },
                        { {2L, 23L}, {55L, 19L}, {2L, 99L} } };

   std::cout << "maxRank a0 = " << maxRank(a0) << '\n';
   std::cout << "maxRank a1 = " << maxRank(a1) << '\n';
   std::cout << "maxRank a2 = " << maxRank(a2) << '\n';
   std::cout << "maxRank a3 = " << maxRank(a3) << '\n';

   return 0; 
 }
max66
  • 65,235
  • 10
  • 71
  • 111