問題タブ [range-v3]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - range-v3 での CONCEPT_REQUIRES_ 実装
Eric Niebler の range-v3 ライブラリの使用方法を学ぼうとしてソース コードを読んだところ、次のマクロ定義が見つかりました。
つまり、要するに、次のようなテンプレート定義です。
は次のように翻訳されます。
そのマクロがそのように実装されている理由を知りたいです。なぜその整数が必要なのですか? また、テンプレート引数false || cond
だけでなく、なぜそれが必要なのですか?cond
c++ - range-v3 partial_sum ビューの C++ の予期しない値の型
次の最小限の例を考えてみましょう。
これは出力します
ここで倍数が表示されることを期待していましたが、結果は明らかに整数です。これは の動作とは対照的ですview::transform
。
この理由は、実装では、現在の合計値がソース範囲に対応する型を持っているためです。
これは意図したものですか、それともバグですか?
ディスカッション: 変換関数がソース範囲と結果範囲の両方をパラメーターとして使用し、戻り値の型を生成するため、有効な戻り値の型を取得しようとすると問題が発生することがわかります。次のアプリケーションは、source-range-type とこの戻り値の型を使用して、別の (場合によっては異なる) 戻り値の型を生成します。
これにより、原則として、ソース値タイプを変換関数の結果タイプと繰り返し連鎖させます。この繰り返しの繰り返しにより、結果の型が他のすべての中間結果を変換できる特定の型に「収束」する場合にのみ使用可能なものが得られます (上記の例では、この型はdouble
であり、変換関数の最初の呼び出し後に既に取得されています)。 )。
この観察により、回避策を提案できます。バイナリ変換関数を指定された回数適用しcommon_type
、結果の範囲の as 値型を使用します (収束が見つかった場合は、途中で停止します)。最も単純なケースでは、反復回数は 1 回だけです。この繰り返しで妥当な結果が得られない場合でも、source-value-type (またはコンパイラ エラー) に頼ることができます。
明確にするために、上記の例のアプリケーションを次に示します。
3 回目の反復の後、パターンは収束するので、停止しdouble
て返される範囲の value_type として common-type を選択します。
このアプローチがすべての理論的状況で完全に有効かどうかはわかりませんが、少なくとも最初の例では 2 倍になります。これは誰もが強く期待していることだと思います。
c++ - データを range-v3 に置き換える
TL;DR
どのようにして同じ結果を得ることができますか
range-v3、そしておそらくその素晴らしい構文を使用していますか?
編集
私が問題を抱えていた理由は、 を正しく使用する方法を誤解していたことranges::copy
です。2 番目の引数は、範囲オブジェクトではなくiteratorでなければなりません。私のせいです;)
それにもかかわらず、次のように、範囲指定された割り当てを実行するために、ある種の構文糖衣が利用できるかどうかをまだ尋ねています。
問題
2 つの固定サイズのベクトルがあります (実行時)。最初のベクトルでデータの複雑な変換を実行し、結果を 2 番目のベクトルに格納する必要があります。最初のベクトルを保持する必要があり、新しい一時ベクトルを作成したくありません。
共通コード
標準で
ハイブリッド std-rangev3
この単純なケースでは、そうする必要はほとんどありません。ただし、複数の操作が関係する場合は、範囲ビューを作成してから使用するstd::copy
と特に便利です。
書きたいこと
私が期待しているのは、この機能が既に存在していて、見つけることができないということです。
compare - `ranges::view`オブジェクトと`std::vector`の間の同等性を判断する方法は?
優れたrange-v3ライブラリを使用しています。ranges::view
私の関数の 1 つは、と比較したいオブジェクトを返しますstd::vector
。もちろん、要素ごとに比較することはできますが、もっと良い方法があるはずです。
ranges::view
オブジェクトとの等価性を判断する方法はstd::vector
?
c++ - range-v3 ビューを使用して begin()/end() メソッドを実装する
begin() / end() メソッドを実装するために、クラスの内部でビューを使用することは可能ですか?
たとえば、次のクラスを反復可能にしたいと考えています。反復ごと
op
に、2 つの iterable の現在の要素で呼び出されます。
range-v3 のおかげでzip_with
ビューを使用できます (コードはテストされていません!)
しかし、このビューを使用して begin() / end() メソッドを実装できますか?
2 つの反復子 (開始と終了) を安全に比較できますか?
私が達成したい最終結果は、任意の数の binary_op をネストする可能性です。