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

时间:2015-04-02 17:43:26

标签: 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);
}

有没有办法实现这个目标?特别是,是否有可能使用可变参数模板方法?

我可以使用通用template<typename T> f(T& arr),但在这种情况下,我是如何在不明确传递大小的情况下恢复大小的? (即使使用可变参数模板方法,我也不确定如何恢复包中的各个元素......没有某种递归折叠)。

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

1 个答案:

答案 0 :(得分: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);
}

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

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

生命example