Я нуждаюсь в некотором руководстве относительно вопроса от курса языков программирования, который я беру.
Нам нужно найти способ реализовать класс массива в C ++, чтобы доступ к его элементу статически проверялся на переполнение.
Мы не должны использовать C ++ 11 (статическое утверждение) или какое-либо другое решение черного ящика — это теоретический вопрос, а не то, что мне нужно для целей кодирования.
мы получили сильный намек на слайды лекции:
msgstr «невозможно обнаружить переполнение индексов массива, когда индексы имеют тип integer — нет, если тип индексов соответствует размеру массива (который должен быть частью типа массива).
«
Я думал об использовании строки фиксированной длины (размера массива) для индексов, но, кроме размышлений о параметре, я действительно не получил много :(.
Пояснение: хорошо, у этого есть некоторые запутанные ответы на это, вероятно, потому что я был неясен — поэтому я еще раз подчеркну:
В свете всего этого, я думаю, они хотят какой-то трансформации
int -> (Тип индексов)
это как-то дает сбой или вычисляет неправильные значения для этих индексов в случае переполнения массива.
Надеюсь, теперь все стало понятнее. Спасибо тебе
Возможно, он намеревается индексировать массив на основе типа, в котором значение является частью типа, например std::integral_constant<int, value>
, Используя это, размер может быть проверен во время компиляции. Однако без static_assert
Трудно придумать простые способы утверждать, что одна константа меньше другой.
Здесь я использую трюк сравнения, если индекс меньше размера, преобразования его в целое число (0, если оно выходит за границы, или 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
}
Это кажется довольно сложным для ограничений, наложенных на вас, я думаю, что вы, скорее всего, неправильно поняли своего профессора где-то на линии.
Других решений пока нет …