C++11 std::rank是如何实现的?

C++11 std::rank是如何实现的?,c++11,std,rank,C++11,Std,Rank,我看了这篇档案文章 但我仍然不清楚std::rank实现的逻辑是如何工作的 当我提到以下内容时 我在可能的实施下看到了以下内容 template<class T> struct rank : public std::integral_constant<std::size_t, 0> {}; template<class T> struct rank<T[]> : public std::integral_constant<std::si

我看了这篇档案文章

但我仍然不清楚
std::rank
实现的逻辑是如何工作的

当我提到以下内容时

我在可能的实施下看到了以下内容

template<class T>
struct rank : public std::integral_constant<std::size_t, 0> {};

template<class T>
struct rank<T[]> : public std::integral_constant<std::size_t, rank<T>::value + 1> {};

template<class T, std::size_t N>
struct rank<T[N]> : public std::integral_constant<std::size_t, rank<T>::value + 1> {};
模板
结构秩:public std::integral_常量{};
样板
结构秩:public std::integral_常量{};
样板
结构秩:public std::integral_常量{};

有人能简单解释一下上述实现逻辑是如何工作的吗?(它使用可变模板吗?

我将尝试用一种简单的方式解释

使用
std::rank
可以知道数组类型的维数,其中not数组被视为零维数组

给定类型
T
,有三种情况:

  • T
    不是数组
  • T
    是另一种类型
    U
    元素的“未知边界数组”(参见中),即大小未知的数组,我们可以将其表示为
    U[]
    ,其中
    U
    是另一种类型
  • T
    U
    类型元素的已知大小
    N
    上的数组,我们可以将其表示为
    U[N]
    ,其中
    U
    是另一种类型
  • 在案例2和案例3中,子类型
    U
    可以是数组,也可以不是数组,因此游戏将重新启动

    看看我在案例2和案例3中使用
    U
    而不是
    T
    重写的“可能实现”

    // case 1: T isn't an array
    template<class T>
    struct rank
       : public std::integral_constant<std::size_t, 0>
     { };
    
    // case 2: T is an array of unknown bound (U[])
    template<class U>
    struct rank<U[]>
       : public std::integral_constant<std::size_t, rank<U>::value + 1>
     { };
    
    // case 3: T is an array on size N (U[N])
    template<class U, std::size_t N>
    struct rank<U[N]>
       : public std::integral_constant<std::size_t, rank<U>::value + 1>
     { };
    

    我还想了解按照递增值连续剥离数组维度的实现逻辑。这可以用一个简单的例子来解释吗?@user9196120-我想最后的“实际例子”应该可以解释它。
       std::rank<int[1][2][3]>::value
    == 1 + std::rank<int[1][2]>::value
    == 1 + 1 + std::rank<int[1]>::value
    == 1 + 1 + 1 + std::rank<int>::value
    == 1 + 1 + 1 + 0
    == 3