Прежде всего, я прошу прощения за долгое приведение к такому упрощенному вопросу.
Я реализую класс, который служит очень длинным одномерным индексом на кривой заполнения пространства, или n-кортеж, представляющий декартову координату, которой соответствует индекс.
class curvePoint
{
public:
friend class curveCalculate;
//Construction and Destruction
curvePoint(): point(NULL), dimensions(0) {}
virtual ~curvePoint(){if(point!=NULL) delete[] point;}
//Mutators
void convertToIndex(){ if(isTuple()) calc(this); }
void convertToTuple(){ if(isIndex()) calc(this); }
void setTuple(quint16 *tuple, int size);
void setIndex(quint16 *index, int size);
void setAlgorithm(curveType alg){algorithm = alg;}
//Inspectors
bool isIndex(){return current==Index;}
bool isTuple(){return current==Tuple;}
size_t size(){return dimensions;}
quint16 operator[](size_t index);
enum curveType{HilbertCurve, ZCurve, GrayCodeCurve};
enum status{Index, Tuple};
private:
curveCalculate calc;
curveType algorithm;
quint16 *point;
size_t dimensions;
status current;
};
(длина массива, на который указывает точка , равна измерения )
В любом случае при реализации оператора [] мне было интересно, каков наилучший способ проверки границ. Я хочу избегать выдачи исключений, если это вообще возможно, и полный диапазон значений можно использовать для каждого числа в массиве, поэтому специальное значение, возвращаемое в случае ошибки вне границ, также невозможно;
Я думал о чем-то вроде этого, хотя и реализовано в определении класса:
quint16 curvePoint::operator[](size_t index)
{
return point[ index % dimensions ];
}
Это делает так, что мы никогда не покидаем границ массива, и если я хорошо документирую, я думаю, что это будет хорошо; тем не менее, я настороженно отношусь к этой конкретной реализации.
Это выглядит приемлемым для других?
Есть ли другой способ проверки границ, в то же время удовлетворяя моим ограничениям?
Edit:
Расчет таких вещей, как кривые Гильберта и т. Д., Очень запутанный, достаточно запутанный, поэтому я не хочу, чтобы добавлялся дополнительный интерфейс для библиотек stl.
Кроме того, поскольку мне придется преобразовывать многие тысячи из них каждый раз, когда запрашивается многомерная база данных, я не хочу дополнительных затрат на вызовы функций stl в миксе, если это вообще возможно.
Мне скорее нравится идея утверждения; но, если я правильно помню, что перерывы в сборках релизов не так ли?
Полагаю, я могу использовать исключения, это то, за что все рутируют, но я использую библиотеки Qt, и они избегают исключений как по производительности, так и по переносимости, и я надеялся сделать то же самое.