3

我需要一些关于我正在学习的编程语言课程中的问题的指导。

我们需要想出一种在 C++ 中实现数组类的方法,以便静态检查访问它的元素是否溢出。我们不使用 C++11(静态断言)或任何其他黑盒解决方案 - 这是一个理论问题,而不是我出于编码目的需要的东西。

我们确实在讲座幻灯片中得到了强烈的暗示:

“当索引是整数类型时,不可能检测到数组索引的溢出——如果索引的类型对应于数组大小(它必须是数组类型的一部分),则无法检测到。”

我考虑过使用固定长度(数组大小)字符串作为索引,但除了考虑这个选项之外,我真的没有得到太多:(。

澄清:好的,这得到了一些混乱的答复,可能是因为我不清楚 - 所以我会再次强调:

  1. “静态”的意思是“在编译时”。编译器应该提醒用户溢出(警告/错误..)。不是运行时!
  2. 阅读给我们的“提示”——它会被使用。具体来说,程序可能不会检查边界!具体而言,不使用或模拟 c++ 中数组的 at() 方法。

鉴于这一切,我认为他们想要的是某种转换 int->(Indices type) 以某种方式失败或为这些索引计算错误值,以防数组溢出。

希望现在更清楚了。谢谢你的

4

1 回答 1

2

也许他打算让您根据值是类型的一部分的类型来索引数组,例如std::integral_constant<int, value>. 使用它,可以在编译时检查大小。但是,如果没有static_assert,就很难想出简单的方法来断言一个常数小于另一个常数。

在这里,我使用比较索引是否小于大小的技巧,将其转换为整数(如果超出范围,则为 0,否则为 1),将其乘以 2 并减去 1,得到(-1 表示 out边界,或 1 表示有效),然后制作该大小的数组。如果索引超出范围,这会导致编译错误,如果索引有效,则会被优化。

#include <type_traits>

template<class T, int count>
struct array {
    array() : data() {}

    template<int N>
    T& operator[](std::integral_constant<int,N> index) {
        //compiler error if index is too small
        char index_is_too_large[(N<count)*2-1]={}; 
        index_is_too_large[0] = index_is_too_large[0]; 
        //second line makes the compiler ignore warnings

        return data[N];
    }
private:
    T data[count];
};

#include <iostream>
int main() {
    array<float, 3> thingy;

    std::integral_constant<int, 2> index2;
    std::cout << thingy[index2] << '\n';

    std::integral_constant<int, 3> index3;
    std::cout << thingy[index3] << '\n'; //COMPILER ERROR ON THIS LINE
}

对于施加在您身上的限制而言,这似乎相当先进,我认为您更有可能在某个地方误解了您的教授。

于 2013-06-25T22:55:10.177 回答