将二维数组作为参数传递给for循环中的函数

问题描述

我正在努力将可变大小的二维数组作为参数传递给函数。我已经在网上搜索了一段时间,但没有找到解决方案。当正手创建两个大小不同的数组时,我的代码可以工作,但是当我使用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中也是如此。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...