Rangeの勉強その3
翻訳の続き
3 Rangeの基盤の基本 (Part1)
typetraitsと独立関数からなるlibraryの基本要素について.
* rangeの概念
* synopsis(1)
* specification(1)
3.1 Rangeの概念
このセクションではrangeの概念(concepts)を紹介する. rangeの概念は2つの構成要素からなる.
1. 関連しているiteratorのtraveral type
2. rangeがcopyableかどうか, そしてrangeのイテレート時に要素を所有しているかどうか
特に指定がなければRangeはnoncopyableであると見なされる.
従って我々は以下のrangeのtypeについて語ることになる.
* SinglePassRange
* ForwardRange
* BidirectionalRange
* RandomAccessRange
その式の型がrangeのモデルであるようなすべての式rngは, 次の独立した3つの関数の引数に使用することが出来る.
* begin(rng)
* end(rng)
* empty(rng)さらに, 式の型がForwardRangeのモデルであるようなものについては次を使用することが出来る.
* size(rng)
CopyableRangeで要素を所有しているものはdeep-copyなcopy-constructorを持っている.
See also
* Boost.Range concepts
* n1640(new iterator concepts)
3.2 Synopsis (1)
次を
ヘッダ(のstd名前空間内に)に追加する. < > 3.3 Specification (1)
以下のptrはT*型の変数である.<
>
3.4 議論
1. 上記のTransformationTraitsは現行のBoost.Rangeにあるものと僅かな差異がある. 特にBoost.Rangeの方はrange_iteratorとともに, template引数のconst性に影響されないようなrange_const_iteratorも持っている. だが経験的に, iteratorに対してtemplate引数のconst性を追跡するようなことはまれであるし, この2つのtraitsは1つにまとめることが出来る. (これはreverse_iteratorにも当てはまる意見である).
2. Boost.Rangeは今の所, 配列と文字配列を別に扱うが, この動作はdeprecatedであり, 従ってこの提案には含まれない. Boost Dev. listでの長ったらしい議論の末, この動作は実に, genericなコードの問題だと結論された.
3. Boost Dev. listでの議論の中で, n1674でWalter Brownが提案したcbegin()/cend()とcrbegin()/crend()より, const_begin()/const_end()とconst_rbegin()/const_rend()の方が好ましいということになった.
4. core機能は以下の型がrangeの概念(concept)に適合することを意味している.
* standard containers(tr1::arrayを含む)
* pair of iterator
* 組み込み配列
当然, tupleのような他の型のサポートも追加される.5. もしTransformationTraitsの使用が冗長だと思うならば, template aliasを用いることによって, 我々は次のような省略形を使うことが出来る.
namespace rng { template< class T > using iterator = typename range_iterator<T>::type; }6. 我々は range_categoryをTransformationTraitに追加するべきだろうか?
はてなって引用記法のなかでソースのハイライト記法使えたのかー