C++模板特化中如何检测C风格多维数组?可使用可变模板吗?
实现方案
可以使用可变模板完成该需求,只需要新增如下多维数组偏特化即可:
template<class T, std::size_t N, std::size_t... Rest> struct detect_carray<T[N][Rest...]> { constexpr static int kind = multi_carray; };
逻辑说明
- C风格多维数组的本质是「数组的数组」,例如
double[3][5]的元素类型是double[5],整体是长度为3的数组。 - 上述偏特化会匹配所有维度≥2的数组:只要类型匹配
T[N][Rest...]格式(Rest...至少包含1个长度值),就会命中该特化,返回multi_carray对应的值1。 - 一维数组命中你原有写好的单维度特化返回0,非数组类型命中主模板返回-1,完全符合你给出的测试用例预期。
将该特化添加到原有代码后,运行你给出的main函数即可得到预期输出-1011。
内容的提问来源于stack exchange,提问作者PavelDev
相关产品推荐
相关产品推荐

