通过引用传递未知秩的数组

Pass array of unknown rank by reference

本文关键字:数组 未知 引用      更新时间:2023-10-16

我正试图通过引用传递一个未知维数(秩)的数组。基本上,我想做这样的事情(不编译)

template <typename T, int... dims>
void f(T (&arr)[dims]...) // not working
{
    // would like to modify the elements of `arr` here, according to some rule
}
int main()
{
    int arr[2][3][4]; // rank 3
    f(arr);
}

有什么办法可以做到这一点吗?特别是,是否有可能使用可变模板方法?

我可以执行通用的template<typename T> f(T& arr),但在这种情况下,如何在不显式传递大小的情况下恢复大小?(即使使用可变模板方法,我也不知道如何在没有某种递归折叠的情况下恢复包中的单个元素)。

特别是,我正在寻找一种根据某些规则初始化未知秩数组的简单方法。

您只需传递对类型为T的数组的引用。那么T可以是另一个数组等等。不需要复杂的语法。所以你的代码看起来是这样的:

template <typename T, int sz>
void f(T (&arr)[sz]) // working
{
    std::rank<T[sz]>::value; //evaluates to array rank
}
int main()
{
    int arr[2][3][4]; // rank 3
    f(arr);
}

然后,您可以使用std::rank来获得数组秩。

使用std::remove_extent和模板递归可以得到子数组的大小。

生活榜样。