我查看了这个档案帖子
Implementing std::rank for other containers
但我仍不清楚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> {};
有人能提供一个关于上述实现逻辑如何工作的简单解释吗? (它是否使用可变参数模板?)
答案 0 :(得分:1)
我会尝试以简单的方式解释。
使用std::rank
,您想知道数组类型的维数,其中非数组被视为零维数组。
给定类型T
,您有三种情况:
T
不是数组T
是&#34;未知界限的数组&#34; (参见this page)其他类型U
的元素,即未知大小的数组,我们可以表达为U[]
,其中U
是另一种类型T
是N
类型元素的已知大小U
的数组,我们可以将其表示为U[N]
,其中U
是另一种类型在第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
(假设T
为int[3]
,那么U
为int
并且N
是3
)有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