C++静态模板维度:首维度为0时传引用调用函数报错问题
解决C++模板函数处理零长度二维数组的问题
问题原因
标准C++不允许长度为0的数组,GCC虽以扩展特性支持零长度数组,但模板函数中float (&A)[m][n]这种数组引用类型,当m=0时属于标准未定义的类型,导致模板参数匹配失败,无法通过编译。
解决方案
以下两种方案均无需修改main函数的调用语法:
方案1:模板特化
针对m=0的场景编写模板特化版本,改用指针参数适配零长度数组的退化特性:
// 通用版本:处理m>0的二维数组引用 template<int m, int n> void foo(float (&A)[m][n]){} // 特化版本:处理m=0的情况,接受指向一维数组的指针 template<int n> void foo<0, n>(float (*A)[n]){} int main(){ float x[3][4], y[0][4]; foo<3,4>(x); foo<0,4>(y); }
方案2:SFINAE重载(C++11及以上)
利用std::enable_if对通用版本做编译期筛选,同时提供重载版本处理m=0的场景:
#include <type_traits> // 仅当m≠0时启用,处理正常二维数组引用 template<int m, int n> typename std::enable_if<m != 0>::type foo(float (&A)[m][n]){} // 处理m=0的情况,接受指向一维数组的指针 template<int n> void foo(float (*A)[n]){} int main(){ float x[3][4], y[0][4]; foo<3,4>(x); foo<0,4>(y); }
说明
零长度数组是GCC的非标准扩展,若需完全兼容标准C++,建议改用std::array<std::array<float, n>, m>替代原生数组,但此方式需修改main中的变量定义,不符合需求故未采用。
内容的提问来源于stack exchange,提问作者kaisong
相关产品推荐
相关产品推荐

