我试图通过引用传递一个未知数量的维度(排名)的数组。基本上,我想做这样的事情(不编译)
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)
,但在这种情况下,我是如何在不明确传递大小的情况下恢复大小的? (即使使用可变参数模板方法,我也不确定如何恢复包中的各个元素......没有某种递归折叠)。
特别是,我正在寻找一种根据某种规则初始化未知秩数组的简单方法。
答案 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。