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

标签 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) ,但在这种情况下,我如何能够在不显式传递它们的情况下恢复尺寸? (即使使用可变参数模板方法,我也不确定如何在没有某种递归折叠的情况下恢复包中的各个元素。)

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

最佳答案

您只需传递对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 .

关于c++ - 通过引用传递未知等级的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29419198/

相关文章:

c++ - 从堆栈跟踪中查找共享库中的源代码行

c# - 为什么要在 char 上使用定界符?基于c的

C++ 收集2 : error: ld returned 1 exit status

javascript - 如何过滤出一个字符串,使其仅包含普通 Javascript 中的字母?

c++ - 模板层次结构中的可选虚函数取决于参数

c++ - 仅当它不是别名时,如何编写 std::chrono::high_resolution 时钟类模板特化

c++ - O'Reilly 的 "Objective-C Pocket Reference"声称 C++ 不支持动态调度,这是真的吗?

C++ getline(string) 与多线程有关的段错误

arrays - 在 Swift 中对字符串字典数组进行排序

javascript - yeoman/JS : Repeating HTML blocks in a HTML template - compiling to eventually integrate with Wordpress?