2016-04-26 105 views
1

我剛剛遇到std::rank,我不太明白它可以用於什麼。我明白它的作用,但有人可以給我幾個用例嗎?我在這裏找不到有用的東西。std :: rank的用途是什麼?

+0

這是功課。 – user43389

+0

它的主要用途可能是在模板元編程中,但它會根據您的需求而大不相同(我們無法猜測)。 – edmz

回答

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; 
}