Podczas implementacji operatora [] jak powinienem uwzględnić sprawdzanie granic?

Przede wszystkim przepraszam za długie doprowadzenie do tak prostego pytania.

Wdrażam klasę, która służy jako bardzo długi 1-wymiarowy indeks na krzywej wypełniania przestrzeni lub n-krotce reprezentującej współrzędną kartezjańską, której indeks odpowiada.

<code>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;
};
</code>

(Długość tablicy wskazywanej przezpunkt jestwymiary)

W każdym razie w implementacji operatora [] zastanawiałem się, jaka jest najlepsza metoda sprawdzania granic. Chcę uniknąć rzucania wyjątków, jeśli w ogóle jest to możliwe, a pełny zakres wartości jest użyteczny dla każdej liczby w tablicy, więc specjalna wartość do zwrócenia w przypadku błędu poza granicami też nie jest możliwa;

Myślałem o czymś takim, choć zaimplementowanym w definicji klasy:

<code>quint16 curvePoint::operator[](size_t index)
{
    return point[ index % dimensions ];
}
</code>

To sprawia, że ​​nigdy nie opuszczamy granic tablicy i jeśli dobrze udokumentowane, myślę, że będzie dobrze; niemniej jednak uczę się tego konkretnego wdrożenia.

Czy to wygląda na akceptowalne dla innych? Czy istnieje jakikolwiek inny sposób sprawdzania granic, który nadal spełnia moje ograniczenia?

Edycja: Obliczanie rzeczy, takich jak krzywe Hilberta itp., Jest bardzo bałaganiarskie, na tyle nieuporządkowane, że nie chcę mieć dodatkowego interfejsu dla bibliotek stl.

Dodatkowo, ponieważ będę musiał przekonwertować wiele tysięcy za każdym razem, gdy odpytywana jest wielowymiarowa baza danych, nie chcę dodatkowego kosztu wywołań funkcji stl w miksie, jeśli w ogóle jest to możliwe.

Podoba mi się raczej idea twierdzenia; ale jeśli dobrze pamiętam, czy przerwy w kompilacjach wersji nie są prawidłowe?

Przypuszczam, że mogę korzystać z wyjątków, które wydają się być tym, za co wszyscy kibicują, ale używam bibliotek Qt i te unikają wyjątków zarówno pod względem wydajności, jak i przenośności, i miałem nadzieję zrobić to samo.

questionAnswers(13)

yourAnswerToTheQuestion