这个功课问题我一直在破坏我的大脑:
我必须在C++中创建一个数组类,其中在编译时检查对数组中元素的索引访问,即如果我尝试访问具有超出大小的索引的数组,则会导致编译错误.
我以为我会使用枚举作为索引而不是整数,但是我和我的导师说过,他告诉我这不是正确的方法,他还说"认为以相同的价格你可以用这个来排列索引不是从0"或类似的东西开始.
我很感激任何建议!
std::array来自C++ 11就是你所要求的.它是一个具有编译时已知大小的数组,它允许编译时检查越界错误
例:
std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::get<3>(arr); // returns 4;
std::get<9>(arr); // COMPILE ERROR
Run Code Online (Sandbox Code Playgroud)
在内部,这个数组是使用模板化的数组大小实现的(正如你在例子中看到的那样,第一行中的第二个模板参数),static_assert并对你的条件执行编译时检查(在这种情况下就是这样index < array_size).另外正如您在示例中看到的那样,您使用的是std :: get而不是operator [],因为它再次使用模板化参数作为索引,它必须是一个常量表达式(constexpr)以允许编译时检查而不是运行时.
如果你需要一个变量索引,你可以使用旧的good运算符[],但你不会有编译时的越界检查,这根本不可能完成.