Какова цель std::rank?

Я только что столкнулся с std::rank и не совсем понимаю, что это может быть использоваться для. Я понимаю, что он делает, но может ли кто-нибудь дать мне несколько вариантов его использования? Я не смог найти ничего полезного в поиске здесь.


person Xzenon    schedule 26.04.2016    source источник
comment
Его основное использование, вероятно, связано с метапрограммированием шаблонов, но оно будет сильно различаться в зависимости от ваших потребностей (о которых мы не можем догадаться).   -  person edmz    schedule 26.04.2016


Ответы (1)


Хороший вопрос.

Я пытаюсь изучить С++ 11, поэтому я мог бы написать что-нибудь глупое, но... предположим, вы хотите найти максимальное значение в многомерном массиве.

Я пытался ответить на этот вопрос с помощью std::rank (и 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; 
 }
person max66    schedule 26.04.2016