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に追加するべきだろうか?

はてなって引用記法のなかでソースのハイライト記法使えたのかー