まず最初に、このような単純な質問までの長いリードについてお詫び申し上げます。演算子[]を実装するとき、どのように境界チェックを含めるべきですか?
私は、空間充填曲線上の非常に長い1次元インデックスまたはインデックスが対応するデカルト座標を表す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;
};
(配列の長さは、が寸法ある点によって指さ)
[] Iは境界チェックを達成するための最良の方法であると思いまし。可能であれば例外を投げるのを避けたいですし、配列の各数値に対して完全な値の範囲を使用できるので、範囲外のエラーの場合に返す特別な値は不可能です。
私は、クラス定義で実装され、このかかわらような何かを考えていた:
quint16 curvePoint::operator[](size_t index)
{
return point[ index % dimensions ];
}
我々は、配列の境界を離れることはないと十分に文書場合、私はそれは大丈夫だと思うようにするためには、それを作ります。それにもかかわらず、私はこの特定の実装が気にしません。
これは他の人に受け入れられますか? 制約を満たしながら境界チェックを行う方法はありますか?
編集: ヒルベルト曲線などの計算は非常に扱いにくいですが、私は途中でstlライブラリの追加インターフェイスを必要としないほど面倒です。
また、多次元データベースのクエリが実行されるたびにこれらの数千もの変換を行う必要があるため、可能であれば、stl関数呼び出しの追加コストは必要ありません。
私は、主張の考え方にかなり似ています。しかし、リリースビルドの中断が正しくないことを私が覚えていればそれはありませんか?
誰もが根っこにしているような例外を使うことができると思いますが、Qtライブラリを使用していて、パフォーマンスと移植性の両方で例外を避けています。
興味深い点。 –
このオプションはわかりやすいようですが、多次元データベースのコードでは境界をチェックするのに非常に注意していますので、おそらくこれで逃げることができます(特に、データベースコードの外に誰もカーブポイントタイプ)。 アイデアをありがとう。今、私はこの答えと私がこの手紙の直後に書いた答えの間に私の頭の中に投げつけています。 –
これは標準的な動作ですが、実装が[]オーバーロードを含む他の場所で(オプションの)境界チェックを提供することを停止するものは何もありません。そして、これらがあなたのプラットフォームで利用可能な場合は、スイッチを切るよりもスイッチをオンにするほうが正気であるように見えます。プロファイリングが本当に価値があることがわかっている場合は、バイパスしてください。だから私はどこにでもあなたがそうする機会を持っていることを確認することをお勧めします。 –