【发布时间】:2016-04-26 18:44:14
【问题描述】:
我刚刚遇到std::rank,我真的不明白它可以用来做什么。我了解它的作用,但是有人可以给我一些用例吗?我在这里的搜索中找不到任何有用的东西。
【问题讨论】:
-
它的主要用途可能是模板元编程,但它会根据您的需求在很大程度上有所不同(我们无法猜测)。
标签: c++ c++11 std rank typetraits
我刚刚遇到std::rank,我真的不明白它可以用来做什么。我了解它的作用,但是有人可以给我一些用例吗?我在这里的搜索中找不到任何有用的东西。
【问题讨论】:
标签: c++ c++11 std rank typetraits
好问题。
我正在尝试学习 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;
}
【讨论】: