Rangeの勉強その5
翻訳の続き
5 Range utilities (Part3)
Boost.Rangeはコア機能の外側に, iterator viewの使用を手軽にするutility-クラスをいくつか提供している:
- range
- sub_range
view-オブジェクトとcontainer-オブジェクトの間の比較が簡単になるようなオーバーロードされた演算子が提供されている. 例えば:
string s = ...; sub_range<string> sub = find( s, ... ); if( sub == string("foo") ) { sub[0] = 'b'; assert( sub == string("boo") ); }
5.1 クラステンプレートrangeはiteratorの上にtemplate化されている, さらにそれゆえ非常にgenericである.
5.1.1 Synopsis<
>
5.1.2 Specification
テンプレート引数IterはForwardTraversalIteratorのモデルでなければならない.<>
5.2 Sub_range
クラステンプレートsub_rangeは他のRangeからtemplate化されていて, 関連したconst_iteratorが何かを推論できるので, rangeのconst性を伝搬する. そしてsub_rangeはrangeに非常によく似ている.
5.2,1 Synopsis<
>
5.2.2 Specifications
RngはForwardRangeのモデルでなければならない. すべての関数はrangeのそれと似ている.
5.3 議論 (Discussion)
- Boostではrangeはiterator_rangeと呼ばれているが, わざわざiteratorを取り扱っていると言うのは不要であるように思われる.
- Boostのversionのrangeとsub_rangeは渡されるiteratorが特異なものであっても行儀よく動作するようになっている. この提案では, この動作がオブジェクトを2ではなく3ワードに及ばせるような場合について, この動作を取り除いた. さらに, rangeの特異性をそのrangeのiteratorのそれと異なるものにして使用することもあまりないように思われたし.
- ヘルパー関数copy_rangeは3rd Party製の型が2つのiteratorを取るconstructorを提供していない時に重宝するgenericなライブラリである. copy_rangeの特定の版がADLを通じて見つけられるだろう.
議論の第2項の翻訳はかなり悩んだ. 怪しい.