C++模板统计数组维度时偏特化未匹配问题咨询
问题根因
你定义的偏特化仅匹配数组的左值引用类型,但递归时传递给dimension的模板参数是纯数组类型(不带引用修饰符),所以无法触发偏特化匹配,只能走默认主模板。
以你的示例代码为例,第一层偏特化匹配到int(&)[6][3]类型后,拆解出来的T是int[3],这是原始数组类型,不带引用修饰符,自然匹配不到你写的T(&)[N]格式的偏特化。
修复方案
有两种常用的修改思路:
- 方案1:新增匹配纯数组类型的偏特化,逻辑和原有数组引用偏特化完全一致即可
// 原有主模板和数组引用偏特化保留,新增下面的纯数组偏特化 template <class T, size_t N> struct dimension<T[N]> { static constexpr auto n = 1 + dimension<T>::n; void print() { std::cout << __PRETTY_FUNCTION__ << std::endl; dimension<T> d; d.print(); } };
- 方案2:递归传递参数时给
T加上左值引用修饰符,让递归流程也能匹配原有数组引用偏特化
只需要修改原有数组引用偏特化的两处递归代码即可:
template <class T, size_t N> struct dimension<T(&)[N]> { // 给T加引用修饰符 static constexpr auto n = 1 + dimension<T(&)>::n; void print() { std::cout << __PRETTY_FUNCTION__ << std::endl; // 给T加引用修饰符 dimension<T(&)> d; d.print(); } };
效果验证
修改后再运行你的示例代码,会正确识别两层数组结构,输出如下:
void dimension<T (&)[N]>::print() [with T = int [3]; long unsigned int N = 6] void dimension<T (&)[N]>::print() [with T = int; long unsigned int N = 3] T is not an array: void dimension<T>::print() [with T = int]
最终统计得到的n值也会正确为2。
内容的提问来源于stack exchange,提问作者HCSF
相关产品推荐
相关产品推荐

