问题描述
我正在努力将可变大小的二维数组作为参数传递给函数。我已经在网上搜索了一段时间,但没有找到解决方案。当正手创建两个大小不同的数组时,我的代码可以工作,但是当我使用for循环执行此操作时,这将不再起作用。对于第二项任务,我将相同的变量用于相同的功能。我认为在查看代码时问题变得很清楚:
#include <iostream>
using namespace std;
template <typename test>
void func(test& array){
cout << "it worked." << endl;
}
int main()
{
//commented section works
//double a1[10][10]; // create 2 differently sized arrays
//double a2[5][5];
//func(a1); //execute the function for those 2 differently sized arrays
//func(a2);
//uncommented section does not work:
for(int i; i<2; ++i){
const int size = 5*(i+1); // variable size
double a[size][size]; // creating an array with a changing size
func(a); // executing the function that is supposed to work
}
return 0;
}
错误消息是:
test.cpp:14:6:注意:模板参数推导/替换失败:
test.cpp:30:9:注意:可变大小的数组类型'double [size] [size]'不是有效的模板参数
如何使代码的未注释部分起作用?这意味着我如何在此迭代中将二维数组传递给函数。
解决方法
如注释中所述,具有运行时值的C样式数组不是标准C ++。
如果您想要一个具有不同大小数组的循环...如果您可以使用C ++ 20(因此使用模板lambda)...我可以想象的最好的情况是通过两个lambda,并且将不同的模板大小按顺序转换模板值。
类似
[]<std::size_t ... Is>(std::index_sequence<Is...>)
{ ([]{ constexpr auto size = 5u*(Is+1u);
double a[size][size];
func(a); }(),...); }(std::make_index_sequence<2u>{});
显然,这要求循环的最高值是编译时已知的值。
C ++ 20之前的版本...我想第一个lambda必须是一个外部模板函数(应该在C ++ 17中起作用,并且在C ++ 14中应该稍作改动;用{ {1}}在C ++ 11中也是如此。