問題タブ [boost-iterators]
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++ - boost::reverse_iterator に代わる C++11 はありますか?
boost::reverse_iterator を使用する C++03 で実行されているアプリケーションがあります。ようやく C++11 コンパイラにアップグレードできましたが、boost/iterator/reverse_iterator.hpp がインストールされていないことに気付きました (Boost 1.74.0 を使用しています)。
C++11 の std::reverse_iterator がその代わりになるためだと思います。そうですか?
boost::reverse_iterator の代わりに std::reverse_iterator を使用してみましたが、うまくいきません。その理由は、参照型が真の参照ではなくプロキシであるため、私のベース イテレータはランダム アクセスですが、真の STL「ランダム アクセス イテレータ」ではないためです。std::reverse_iterator を使用すると、「参照」のアドレスを取得しようとします。
boost::reverse_iterator に代わる C++11 はありますか?それともアプリケーション用にゼロから作成する必要がありますか?
編集: 申し訳ありませんが、boost::reverse_iterator がまだブースト 1.74.0 にあるというのは正しいです。インクルード パスに問題があり、見落としていました。
boost::reverse_iterator を使用すると、すべてうまくいきます。
std::reverse_iterator がプロキシ参照型で動作すると想定されている場合、コードが動作しなかった理由が気になります。より正確には、失敗する理由はわかりますが、 std::reverse_iterator がプロキシ タイプを完全にサポートしていないように見えます。
特に、std::reverse_iterator の operator->() はプロキシ タイプでは機能しません。その演算子は、値型へのポインターを返す必要があります。イテレータを逆参照し、取得した値のアドレスを取得することで、これを実行しようとします。この場合、反復子を逆参照すると、参照ではなくプロキシが返され、そのアドレスを取得すると右辺値のアドレスが取得されるため、g++ 8.3.1 で次のエラーが生成されます。
std::reverse_iterator を使用して i-> のインスタンスを (*i) に置き換えると、機能しますが、イテレータの動作はそうではありません。
私のイテレーター (MyIteratorType) は boost::iterator_adaptor を使用して構築されており、そのドキュメントによると、不特定のトリックを使用して operator-> をプロキシ タイプで機能させると書かれています。boost::reverse_iterator はその operator-> をベース イテレータのバージョンの上に構築するように見えるため、これらのトリックを利用しますが、std::reverse_iterator は利用しません。
詳しく知っている人がいたら、興味津々です!