Rangeの勉強その4

翻訳の続き。

4 既存のライブラリのコンポーネントへの拡張 (Part2)

4.1 オーバーロードされた演算子

4.1.1 and


2つのiteratorを期待するすべてのiterator-based algorithmに対してオーバーロードを追加する. 言語にconceptが導入されなければ, 実はいくつかのalgorithmにおいてこれは曖昧さを引き入れる(e.g. adjacent_find(), mismatch(), equal(), search_n()). そのためオーバーロードされたalgorithmはstd::rng名前空間に入れようと言う提案がある.(see also 議論(discussion)).


次がchapter17に追加されるであろう:

20.4.4, 25.1-3 そして 26.4に記述されたすべてのiterator based algorithmはおそらく次のようになる
* 次のような形式のすべてのalgorithm:

template< class Iterator, … >
return-type algo( Iterator first, Iterator last, …)

それに対して, range-besedのバージョンは名前空間std::rngに, 次のような形式で置かれる:

template< class Range >
return-type algo( Range&& r, …)

range-basedのバージョンは無修飾のbegin()とend()の呼び出しを用いてstd名前空間内のalgorithmへ転送する. (Remark: 戻り値の型はiterator-basedとrange-basedのそれぞれの関数で共通なreturn-typeで表しておいたよ☆キャピ)


* 次のような形式のすべてのalgorithm:

template< class Iterator, class Iterator2, … >
return-type algo( Iterator first, Iterator last, Iterator2 first2, Iterator2 last2, … )
||
それに対して, range-besedのバージョンは名前空間std::rngに, 次のような形式で置かれる:
>|cpp|
template< class Range, class Range2, … >
return-type algo( Range&& r, Range2&& r2, … )

range-basedのバージョンは無修飾のbegin()とend()の呼び出してを用いてstd名前空間内のalgorithmへ転送する.


上で記述されたものでrange-basedなものはおそらくこのような感じになる.
* 次の用な形式の, output iteratorをとるすべてのalgorithm:

template< …, class OutIter, … >
return-type algo( …, OutIter, … )

それに対して, range-basedのversion:

template< class Sequence, … >
CopyableRange algo( … )

が追加される.


4.2 新しいメンバ関数


basic_string, deque, list, vector, map, multimap, set, multisiteはおそらく次のようになる.

* 次の新しいメンバ関数が追加される.

const_iterator         const_begin() const;
const_iterator         const_end() const;
const_reverse_iterator const_rbegin() const; 
const_reverse_iterator const_rend() const;   

* このような形式のメンバ関数:

template< class Iterator > 
return-type fun( Iterator first, Iterator last )

それに対してrange-basedなversionが追加される.

template< class Range >
return-type fun( const Range& r )

range-basedのversionは無修飾のbegin()とend()の呼び出しによってiterator-basedのversionを媒介する.


* 次のような形式のすべてのメンバ関数:

template< class Iterator >
return-type fun( …, Iterator first, Iterator last)

それに対して, range-basedのversionが次の形式で追加される.

template< class Range >
return-type fun( .., const Range& r )

range-basedのversionは無修飾のbegin()とend()の呼び出しによってiterator-basedのversionを媒介する.

4.3 Tr1とその他の提案

すべてのalgorithmと, tr1に記述されたcontainer, そしてその他の提案が, 上に書かれたような2つのversionによるアプローチを取り入れることが提唱される(suggested).


4.4 議論

  1. 2つのiteratorを取るconstructorがrange-basedなconstructorに追従するべきか. これは, たとえばvectorからdequeへ, のようなコピーを容易にするだろう. 正しい動作をするconstructorを作ることは難しくなるだろうが.
  2. すべてのalgorithmをstd::rng名前空間に置くことはそれなりに議論を呼ぶだろう. userにeasiest-to-useなライブラリを提供するよりもenable-ifのような曖昧さ回避策を検討した方が良いのかもしれない. もちろん言語にconceptが入ってくれたなら, もう何も恐くない何も問題ないのだが.
  3. algorithmの戻り値の型がより良くなるように, だれもがcase-by-caseで見直しをしてもよい. 例えば, remove()がremoveされたもののrangeを返すことが出来ればcontainerのerase()に渡すことが簡単になるなど.


4.4の3の最初の文:


We might one to reconsider on a case-by-case basis if the return type of range-based algothms can be changed for the better.

これの訳しかたがよくわからないです。
[twitter:@zakkas783]さんありがとうございます!