通过引用传递未知等级的数组

vso*_*tco 6 c++ arrays templates c++11

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

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);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个目标?特别是,在某种程度上可以使用可变参数模板方法吗?

我可以做泛型template<typename T> f(T& arr),但在这种情况下我怎么能够恢复大小而不显式传递它们?(即使使用可变参数模板方法,我也不确定如何恢复包中的各个元素...没有某种递归折叠).

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

AnA*_*ons 3

您只需传递对类型数组的引用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);
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用 获取数组排名std::rank

std::remove_extent您可以通过使用模板递归来获取子数组大小。

生活例子