【问题标题】:How has std::rank been implemented?std::rank 是如何实现的?
【发布时间】:2018-03-19 08:18:01
【问题描述】:

我看过这个存档帖子

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

谁能简单解释一下上述实现逻辑是如何工作的? (它是否使用可变参数模板?)

【问题讨论】:

    标签: c++11 std rank


    【解决方案1】:

    我会尽量用简单的方式解释。

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

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

    1. T 不是数组
    2. T 是另一个类型U 的元素的“未知边界数组”(参见this page),这是一个未知大小的数组,我们可以表示为U[],其中U 是其他类型
    3. T 是已知大小的数组 N 类型为 U 的元素,我们可以将其表示为 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>
     { };
    

    当你在非数组类型T 时请求std::rank&lt;T&gt;::value 时,唯一匹配的rank 版本是第一个,所以value 为零(继承自std::integral_constant&lt;std::size_t, 0&gt;)。

    相反,当T 是数组类型时,当您要求std::rank&lt;T&gt;::value 时(假设T 是int[3],那么U 是int 和N 是3)有两个匹配std::rank&lt;T&gt; 的rank 版本:第一个(主要的,非专业化的)和两个部分专业化之一)。但是 C++ 的规则强制编译器选择最专用的版本,所以选择在std::rank&lt;U&gt;::value 处添加1 的专用版本(第三个版本,在int[3] 的情况下)。

    一个实际的例子

       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 
    

    【讨论】:

    • 我还想了解连续剥离数组维度的实现逻辑,以保持递增值。这可以通过一个简单的例子来解释吗?
    • @user9196120 - 我想最后的“实际例子”应该解释它。
    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 2020-04-26
    • 2010-11-30
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    相关资源
    最近更新 更多