【问题标题】:Ensuring C++ Array Parameter Size at Compile Time在编译时确保 C++ 数组参数大小
【发布时间】:2013-11-15 18:15:22
【问题描述】:

在 C++ 编译时,无论如何要确保数组参数的长度?这样:

void foo(T arr[3]);

int main()
{
    T a[5] = { /* ... */ };
    foo(arr);
    return 0;
}

会产生编译时错误吗?

是使用模板类型确保这一点的唯一方法

template <int N, class T>
struct Array{
   T arr[N];
};

void foo(Array<3, T> &arr);

int main()
{
   Array<5, T> a;
   foo(a);
   return 0;
}

或者有没有更惯用的方法来处理这个问题?

【问题讨论】:

  • 不要创建它。它已经为您完成了:std::array/boost::array。不过,这是正确的解决方案。
  • 我只是在做了一些更深入的谷歌搜索后才发现。我似乎找不到多维数组的解决方案。 C++11 风格的 typedef 是否正确:template&lt;class T, int N, int M&gt; using array2d = array&lt;array&lt;T, M&gt;, N&gt;

标签: c++ arrays templates compile-time


【解决方案1】:

如果你真的想要编译时错误,你可以定义函数来引用:

void foo(T (&arr)[3]);

【讨论】:

  • 这似乎是使用 STL 和模板最简洁的解决方案。谢谢你。我认为这也适用于多维数组:void foo(T (&amp;arr)[3][5]?
  • 哦,当然可以!即使没有对数组的引用,也必须在编译时确保第二维。应该更仔细地考虑那个。
猜你喜欢
  • 1970-01-01
  • 2016-06-18
  • 2020-02-22
  • 2014-11-28
  • 2022-01-12
  • 1970-01-01
  • 2010-09-14
  • 2011-05-19
  • 1970-01-01
相关资源
最近更新 更多