【问题标题】:Passing variable-length 2D array to functions using template使用模板将可变长度二维数组传递给函数
【发布时间】:2022-01-23 17:27:28
【问题描述】:

这是我遇到的问题的一个示例:

#include <stdio.h>
#include <iostream>

template<std::size_t U, std::size_t V>
void func2(int (&twoDArrayA)[U][V], const int shift){
    const int length = 1 << shift;
    int twoDArrayB[length][length]; //Successful
}

//template<std::size_t A> <-- Tried to solve the problem by adding this
void func1(const int shift){
    const int length = 1 << shift;
    int twoDArrayA[length][length]; //Failed

    func2(twoDArrayA,shift);
}

int main() {
    const int shift = 3;
    func1(shift);
}

错误信息:

错误:没有匹配函数调用 'func2(int [length][length], const int&)' 模板参数扣除/替换失败: 可变大小数组类型“int”不是有效的模板参数

我以为是因为在func2之前使用了模板,所以我尝试在func1上做同样的事情。尝试调用 func1 反而失败了。错误信息:

错误:没有匹配函数调用 'func1(const int&)' 模板参数扣除/替换失败: 无法推导出模板参数'A'

有什么方法可以将 twoDArrayA 这样的参数传递给 func2?

【问题讨论】:

  • 简单地使用std::vector&lt;T&gt;而不是滚动你自己的东西怎么样?
  • 关于 "int twoDArrayA[length][length]; //Failed" - 你可能会觉得这很有趣:Why aren't variable-length arrays part of the C++ standard?
  • 这不会使您的数组成为可变长度数组。这仍然是固定长度的,因为编译器在编译时评估这两个模板参数。模板方法不能在任何情况下都替代std::vector

标签: c++ arrays templates multidimensional-array


【解决方案1】:

func2 无法推断出数组大小,因为它在编译时是未知的; length 是在运行时根据您传递给func1 的参数决定的。要使引用传递与模板参数和推导一起使用,您需要在编译时拥有一个具有定义大小的二维数组,例如int arr[8][8]

看起来您正在处理的代码想要根据shift 确定func1 中的数组大小,然后将该数组传递给func2。您可以考虑将func2 设计为采用int**,然后根据1&lt;&lt;shift 的结果像访问二维数组一样访问它:

void func2(int** twoDArrayA, const int shift) {
  const int length = 1 << shift;
  int last_item = twoDArrayA[length-1][length-1]
}

您还可以找到一些更有用的资源here

【讨论】:

  • 我想知道在这种情况下我应该如何定义twoDArrayA。
猜你喜欢
  • 2014-10-14
  • 2020-11-01
相关资源
最近更新 更多