我需要就我正在参加的编程语言课程提出一些问题的指导。
我们需要想出一种在C ++中实现数组类的方法,以便静态检查访问它的元素是否存在溢出。 我们不使用C ++ 11(静态断言)也不使用任何其他黑盒解决方案 - 这是一个理论问题,而不是我需要编码的目的。
我们在演讲幻灯片中得到了强烈暗示:
” 当索引是整数类型时,不可能检测到数组索引的溢出 - 而不是索引的类型对应于数组大小(必须是数组类型的一部分)。 “
我考虑过为索引使用固定长度(数组大小)字符串,但除了考虑选项之外,我真的没有太多:(。
澄清:好的,这有一些困惑的回复,可能是因为我不清楚 - 所以我会再次强调:鉴于这一切,我认为他们想要的是某种转变 int->(指数类型) 在数组溢出的情况下,以某种方式失败或计算这些索引的错误值。
希望现在更清楚。谢谢你的
答案 0 :(得分:2)
也许他打算让你根据值属于类型的类型来索引数组,例如std::integral_constant<int, value>
。使用它,可以在编译时检查大小。但是,如果没有static_assert
,很难想出断言一个常数小于另一个常量的简单方法。
在这里,我使用比较的技巧,如果索引小于大小,将其转换为整数(如果超出界限则为0,否则为1),将其乘以2并减去1,得到( - 1表示越界,或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
}
对于你的限制,这似乎相当先进,我认为你更有可能误解了你的教授。