2011-10-01 18 views
2

私は設計しているライブラリに対して水密のインターフェイスを作ろうとしています。ユーザーは2次元データを入力することになるので、std::transformに似たイテレーター・インターフェースが透明であると考えました。 しかし、イテレータの乱用をどのように処理するかはわかりません。イテレータのインターフェイスを処理する例外

私のインタフェースは、(1よりよいがある場合、私はインターフェイスを変更することができます)のようなものです:たとえば

template<typename InputItrX, typename InputItrY> 
set_data(InputItrX beginX, InputItrX endX, InputItrY beginY) 
{ 
    //What exception handling should I do here? 
    size_t array_size = endX-beginX; //get the size of the xarray. 
    my_xVector.resize(array_size); //resize my internal container 
    my_yVector.resize(array_size); // ..and for the ydata. 
    std::copy(beginX, endX, my_xVector.begin());    //copy X 
    std::copy(beginY, beginY+array_size, my_yVector.begin()); //copy Y 
} 

ユーザーがインターフェイスでアップ混乱と

を書き込み得れば、私のプログラムが不定となり
set_data(xdata.begin(), ydata.begin(), xdata.end()); 

またはxdataには20個の要素がありますが、ydataには要素がありません。

私のライブラリインターフェイスでこのような間違いを確認することはできますか?

答えて

1

私はメソッドにチェックを追加しませんが、例外仕様は使用されているイテレータに依存することを文書化します。したがって、ユーザーは、パフォーマンスの低下やチェックされていないイテレータを気にせず、最良のパフォーマンスを得ることができれば、チェックされたイテレータを使用できます。 STLイテレータのほとんどの実装では、イテレータの非互換性をチェックするアサーションがあります。これらのエラーは、プログラマの間違いであるため、リリースモードでチェックする必要はありません。

size_t array_size = endX-beginX; //get the size of the xarray. 
my_xVector.resize(array_size); //resize my internal container 
my_yVector.resize(array_size); // ..and for the ydata. 

これにより、メソッドは-operatorを持たないイテレータと互換性がなくなります。ランダムアクセスイテレータでのみ使用できます。これを、ランダムアクセスイテレータ用に実装できるresize_vectorsテンプレートに抽出する必要がありますが、他のイテレータのサイズ変更は行いません。 std::copyでは、ベクトルのサイズを変更するインサータイテレータを使用する必要があります。一方、ベクトルに十分な容量がない場合は挿入します。

+0

+1、私はランダムアクセス制限について考えていませんでした。 – Tom

+0

完全性のために:ランダムアクセスイテレータチェックはここで扱われます:http://stackoverflow.com/q/4307271/498253 – Tom