ジョナサンBoccara(の作者流暢C ++は)と呼ばれるライブラリを書いたパイプを。
この「配管」、リポジトリのメインページは言う、それが同じに見えるにもかかわらず、範囲の使用のようではありません:それは引いて怠惰な、しかし押しむしろ熱心に基づいていません。しかし、だ述べ 1は、様々な「パイプ」の操作を実行する範囲のライブラリを使用することはできません。例えば:
- 解凍 - zip形式の入力を取得 - 本質的にKタプルの範囲 - 及び農産物K別個の独立した出力を。
- フォーク - プロデュース複数の容器/範囲の(独立した)コピー。
、原則として、そのような場合は、なぜ私はかなり理解していません。(あなたが最後のイテレータ/センチネルを得ることができない範囲を除いて、もちろん。)
どのような議論されているのは、基本的にプッシュベースの処理方法とプル型の違いです。このパイプライブラリーのようなプッシュシステムでは、処理のチェーンを確立し、各処理ステップは、次の中に直接そのデータをプッシュ。レンジのようなプルシステムでは、あなたがアクセスし、必要に応じて変更することができ、データの表現を確立します。処理は、それ自体では発生しません。誰かが範囲を消費しようとした場合にのみ発生します。
unzip
およびfork
操作は、両方の1対多の操作です:彼らは、単一の入力を取り、多くの処理操作にマップします。
プッシュシステムとして、パイプライブラリーは、そのAPIの構造の1対多の操作を処理することができます。動作は、関数呼び出しによって表されます。入力は、(使用用途の点によって暗示される>>=
、またはプロセッサに渡します)。関数のパラメータは、その出力(プロセッサ自体のために意味のパラメータを無視して)を定義します。C ++の機能はパラメータの任意の番号を持つことができますので、1対多のマッピング操作が自然に落ちます。あなたは、単に様々な出力のための適切なプロセッサを供給しています。
プル方式として、範囲は、戻り値に基づいています。私たちができる最善のは、複数の値を表し、「値」を返しているので、C ++は、複数の値を返すための言語のメカニズムを持っていません。
しかし、レンジアダプタチェーンは、最終的にはされた入力に基づいている範囲。そして、「複数の値を表し『の値は』」で、それ自体の範囲ではありません。これは、範囲を含んでいてもよいが、それはそれの範囲がありません。
だから今、あなたは非常に間違いなく「しない範囲」タイプこれを取ると、あなたの範囲アダプタのすべてがそれで動作するようにする必要があります。レンジアダプタを適用すると、多対多の操作を作成し、タイプ間でその操作を放送しなければなりません。それを行うことは容易ではありません。
しかし、もっと重要な...それはあなたが何を、おそらくではありませんします。あなたの場合はfork
範囲、あなたはほぼ確実に複製された範囲の異なる処理を行いたいです。そして、使用のいずれかのチャンスダウン完全に閉まりという|
操作は、それを行います。あなたはこれらの範囲タプルの特定の部分にアダプターを適用する方法を構築する必要があります。そして、それらの方法は、ますますプッシュベースのプロセッサのように見えるしようとしています。
一日の終わりには、プルスタイルのシステムは、各レベルでの1つの出力を持っています。すなわち、このようなAPIのコアコンセプトのほんの一部です:各処理ステップは、生成範囲。これは、その利点を有している(遅延処理)が、1対多の動作を示すと、その弱点の一つです。
範囲は確かに持つことができるunzip
機能(fork
実際には範囲をコピーしているが)。しかし、それはないだろう|
スタイルアダプター; それはいくつかの分解タイプ上の範囲をとり、範囲のタプルを返す関数であろう。あなたも一緒に多くの処理を行いたい場合は、値、アクセス中の個々の要素をタプルを格納する必要があるだろう、とあなたがフィット感を見るようにそれらを使用しています。