Rangeの勉強その4
翻訳の続き。
4 既存のライブラリのコンポーネントへの拡張 (Part2)
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 議論
- 2つのiteratorを取るconstructorがrange-basedなconstructorに追従するべきか. これは, たとえばvectorからdequeへ, のようなコピーを容易にするだろう. 正しい動作をするconstructorを作ることは難しくなるだろうが.
- すべてのalgorithmをstd::rng名前空間に置くことはそれなりに議論を呼ぶだろう. userにeasiest-to-useなライブラリを提供するよりもenable-ifのような曖昧さ回避策を検討した方が良いのかもしれない. もちろん言語にconceptが入ってくれたなら,
もう何も恐くない何も問題ないのだが.- 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]さんありがとうございます!