std :: rank的目的是什么?

时间:2016-04-26 18:44:15

标签: c++ c++11 std rank typetraits

我刚刚遇到std::rank并且我真的不明白它可以用于什么。我理解它的作用,但有人可以给我一些用例吗?我在这里找不到任何有用的东西。

1 个答案:

答案 0 :(得分:1)

好问题。

我正在尝试学习C ++ 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; 
 }
相关问题