C++ 扩展实现详细信息说明 //基本模板:涵盖非数组类型 样板 结构范围:std::integral_常量{}; //第1特化:覆盖uknown界数组的第1维 样板 结构范围:std::integral_常量{}; //第二专门化:覆盖uknown界数组的第n维 样板 结构范围:范围{}; //第三专门化:覆盖已知类型数组的第一维 样板 结构范围:std::integral_常量{}; //第四专门化:覆盖已知类型数组的第n维 样板 结构范围:范围{};

C++ 扩展实现详细信息说明 //基本模板:涵盖非数组类型 样板 结构范围:std::integral_常量{}; //第1特化:覆盖uknown界数组的第1维 样板 结构范围:std::integral_常量{}; //第二专门化:覆盖uknown界数组的第n维 样板 结构范围:范围{}; //第三专门化:覆盖已知类型数组的第一维 样板 结构范围:std::integral_常量{}; //第四专门化:覆盖已知类型数组的第n维 样板 结构范围:范围{};,c++,templates,C++,Templates,从其他资源获取的可能实现。 请尊敬的社区向我解释一下这是怎么回事。查看第4个规范,不清楚作为递归传递给基类的是如何转换为上层继承数组的子数组类型的。例如,如果我们调用extent其中T[I]=int[2][5],N=1,那么我们传递给基类T,N-1base的实例化就像我们传递int[2]一样,因为最早的T[I]被认为是两个int[5]的数组,所以基类中的T是int[5]其中I=5。这是正确的吗 接下来,为什么第二个规范(对于uknown绑定的数组)没有像第一个规范那样使用零大小,而是依赖于递归实

从其他资源获取的可能实现。 请尊敬的社区向我解释一下这是怎么回事。查看第4个规范,不清楚作为
递归传递给基类的
是如何转换为上层继承数组的子数组类型的。例如,如果我们调用
extent
其中
T[I]=int[2][5],N=1
,那么我们传递给基类
T,N-1
base的实例化就像我们传递
int[2]
一样,因为最早的
T[I]
被认为是两个
int[5]
的数组,所以基类中的
T
int[5]
其中
I=5
。这是正确的吗

接下来,为什么第二个规范(对于uknown绑定的数组)没有像第一个规范那样使用零大小,而是依赖于递归实例化,就好像在某个级别上可以知道维度的大小一样。这个案例的背景是什么,你能举个例子吗

可运行代码段:


一方:有人指出哪些有帮助;还有微软的C++构建洞察力(对我来说不适用)。< /P> < P>你的第一个问题:你是对的。
区段
使用第四个专门化,导致

// basic template: covers non-array types
template<class T, unsigned N = 0>
struct extent : std::integral_constant<std::size_t, 0> {};

// 1st specialization: covers 1st dimension of array of uknown bound
template<class T>
struct extent<T[], 0> : std::integral_constant<std::size_t, 0> {};

// 2nd specialization: covers Nth dimension of array of uknown bound
template<class T, unsigned N>
struct extent<T[], N> : extent<T, N-1> {};

// 3rd  specialization: covers 1st dimension of array of known type
template<class T, std::size_t I>
struct extent<T[I], 0> : std::integral_constant<std::size_t, I> {};

// 4th  specialization: covers Nth dimension of array of known type
template<class T, std::size_t I, unsigned N>
struct extent<T[I], N> : extent<T, N-1> {};
template<class T=int[5], std::size_t I=2, unsigned N=1>
struct extent<T[I], N> : extent<int[5], 0> {};
使用第三个专业化,而不是第一个

template<class T=int[5], unsigned N=1>
struct extent<T[], N> : extent<int[5], 0> {};
模板
结构范围:std::integral_常量{};
在我看来,第一次过载是没有必要的。VisualStudio2019的STL忽略了这一点,只是回到了基本模板

正如我之前在评论中所写的那样,你也可以随意摆弄

template<class T=int[5], unsigned N=1>
struct extent<T[], N> : extent<int[5], 0> {};
template<class T=int, std::size_t I=5>
struct extent<T[I], 0> : std::integral_constant<std::size_t, 5> {};