std :: rank是如何实现的?

时间:2018-03-19 08:18:01

标签: c++11 std rank

我查看了这个档案帖子

Implementing std::rank for other containers

但我仍不清楚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::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> {};

有人能提供一个关于上述实现逻辑如何工作的简单解释吗? (它是否使用可变参数模板?)

1 个答案:

答案 0 :(得分:1)

我会尝试以简单的方式解释。

使用std::rank,您想知道数组类型的维数,其中非数组被视为零维数组。

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

  1. T不是数组
  2. T是&#34;未知界限的数组&#34; (参见this page)其他类型U的元素,即未知大小的数组,我们可以表达为U[],其中U是另一种类型
  3. TN类型元素的已知大小U的数组,我们可以将其表示为U[N],其中U是另一种类型
  4. 在第2和第3例中,子类型U可以是数组,也不是数组,所以游戏重启。

    看看&#34;可能的实施&#34;我在案例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>
     { };
    

    当您在非数组类型std::rank<T>::value时请求T时,唯一匹配的rank版本是第一个,因此value为零(继承自std::integral_constant<std::size_t, 0>)。

    相反,当std::rank<T>::value是数组类型时要求T(假设Tint[3],那么Uint并且N3)有rank的两个版本匹配std::rank<T>:第一个版本(主要的,非专门的)和两个部分特化之一)。但是C ++的规则强制编译器选择最专业的版本,因此选择在int[3]添加1的专用版本(在std::rank<U>::value的情况下为第三版本)。 / p>

    一个实际的例子

       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