C++ 中的编译时安全数组
compile-time safe array in C++?
有一个家庭作业问题
我一直在绞尽脑汁:我必须在C++中创建一个数组类,其中在编译时检查对数组中元素的索引访问,即如果我尝试使用超出 ita 大小的索引访问数组,则会导致编译错误。
我以为我会使用枚举而不是整数作为索引,但我和我的老师交谈过,他告诉我这不是正确的方法,他还说"认为以相同的价格你可以使用它来拥有一个索引不从 0 开始的数组"或类似的东西。
我将不胜感激任何建议!
C++11 的std::array
正是您所要求的。它是一个具有编译时已知大小的数组,它允许编译时检查越界错误
例:
std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::get<3>(arr); // returns 4;
std::get<9>(arr); // COMPILE ERROR
在内部,此数组是使用模板化数组大小(如示例中所示,第一行中的第二个模板参数(和static_assert
对您的条件执行编译时检查(在本例中为 index < array_size
(来实现的。同样,正如您在示例中看到的,您使用的是 std::get 而不是 operator[],因为它再次使用模板化参数作为索引,它必须是一个常量表达式 (constexpr
( 以允许编译时检查而不是运行时。
如果你需要一个变量索引,你可以使用旧的良好运算符[],但你不会有编译时越界检查,这显然是根本不可能的。
这里有一个提示:如果你想在编译时检查值,你基本上只有一个选择:你需要使用非类型模板参数。
标准库类型std::tuple
实现了他的问题,因此请查看它以获取有关如何解决此问题的灵感。
一个提示,可能措辞有点不同:如果要在编译时检查索引,则在编译时也必须知道其值。现在,如何在编译时将某些内容传递给函数?
为了在编译时发出错误信号,static_assert
可以相当容易地使用。
您可能有机会使用自定义类作为索引类型。然后,可以通过限制类的运算符来限制索引元素的生成。特别是这可以确保没有用户输入可以用作索引(如果您不提供任何将整数(或类似(转换为索引类型的方法。如果你允许这样做,你根本没有机会!
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 如何将元素添加到数组的线程安全函数?
- 将对象的字节复制到数组并再次复制回来是否安全
- 适用于大型数组的无复制线程安全环形缓冲区
- 问:Apache Arrow 数组生成器不安全追加
- 线程安全整数数组?
- 将积分类型的数组作为另一个不相关的积分类型的阵列进行访问的安全且符合标准的方法
- 使用字节数组具有单字节对齐方式的结构是否安全
- 在字节数组上转换具有虚函数的结构是否安全?
- 从 C# 到C++和返回的数组,没有不安全的代码
- 将整数添加到数组值而无需调用它的最安全方法
- 我可以使用模板作为多态处理数组的安全解决方案
- 静态指针指向会员数组的安全操作员[]访问
- 在固定的,无序的,拥有的数组中安全,惯用的销毁和压缩
- 在 c++ 的多个线程中编写 c 数组的不同项是否线程安全
- 标准::数组是否可安全返回
- 当结构数组在主线程中填充数据时,从结构数组的低索引元素读取是否线程安全
- 在多线程程序中使用动态数组的头段安全吗
- 当使用来自不同类的字符数组是安全的时
- 当需要数组时,将指针传递到向量中的第一个元素是否安全