問題タブ [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++ - 明示的な範囲 v3 の decltype は void と評価されますか?
範囲の明示的な型を取得しようとしています (将来、クラスにフィールドとして格納する必要があるかもしれません)。しかし、何らかの理由で、それはvoid
?に評価されます。
g++ -std=c++17 でコンパイルすると、
(g++ バージョン g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0)
Visual Studio 2017 v. 15.9 で同様のエラーが発生する
この質問は、私の他の質問の続きです: How to store a range as a field in a class? しかし、より具体的であり、分離するに値すると私は信じています。
c++ - range-v3の複雑な範囲タイプを非表示にする方法は?
range-v3 ライブラリを使用して何らかの範囲を返すメソッドを持つクラスが必要です。そのようなクラスを実装するために、そのクラスの定義にすべてを正しく記述できます。例えば:
ただし、私の実際のケースでは、Foo::r
関数は非常に複雑であり、その実装を非表示にしたいと考えています。Foo
特に、実装では、クラスの宣言時に含める必要のない追加のライブラリを使用します。
ただし、 の定義がFoo::r
宣言から分離されている場合は、戻り値の型を明示的に指定する必要があります。decltype
いくつかの助けが付属しています:
ヘッダー ファイル:
実装、cpp ファイル:
これにより、 の実際の実装を隠すという即時の仕事が行われFoo::r
ます。ただし、戻り値の型は、範囲がどのように構築されているかに関する情報を効果的に「漏らします」。さらに悪いことstd::function
に、範囲パイプラインでオブジェクトを明示的に使用する必要があります。
しかし、返された範囲のユーザーが本当に必要としている情報はそれだけでしょうか? すべてのユーザーがFoo::r
気にかけているのは、それがある種の反復可能であることです。それは持っています:
begin()
範囲の先頭に反復子を与えるend()
イテレータまたは番兵を与える- イテレータをインクリメントして、範囲を反復することができます
- イテレータは逆参照することができ、いくつかの型
T
(Beta*
例の場合) を与えます。
ユーザーは、変換ビューの有無や、変換、フィルターなどの数を気にしません。
それで、私の質問は- そのすべての情報を隠す方法はありますか? 私はこのようなものを書くことができるようにしたいと思います:
ヘッダー内:
cpp ファイルで:
Iterable
生成された型には、非表示プロセスのためにインライン化できない実際の関数呼び出しが含まれている可能性があるという事実を受け入れることができます。リンク時の最適化では、後で最適化できる場合とできない場合があります。
残念ながら、私の知る限り、Iterable
これは単なる概念であり、ライブラリ内の個別の型ではありません。