問題タブ [boost-range]
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++ - std::bind 式で Boost アダプターを使用する
次のコードがあります。
コンパイルしようとすると、clang から次のエラー メッセージが表示されます (完全な出力はこちら)。
バインド オブジェクトにはコピー コンストラクターがありますが、そのコピー代入演算子は削除されているようです。の代わりにラムダを使用しようとすると、同じエラーが発生しますbind
。
これは、C++11 標準、libstdc++ 実装、または Boost アダプター実装のバグですか?
これに対する最善の回避策は何ですか? にラップでき
std::function
ます。それboost::bind
も効いているようです。どちらがより効率的ですか、それとも本当に重要ですか?
c++11 - C ++ 11の列挙子に相当しますか?
C# では、カスタム列挙を非常に簡単に定義できます。たとえば、次のようになります。
(これは、LINQ とより優れたカプセル化を使用して簡略化できますが、それは問題のポイントではありません。)
C++11 では、同様の列挙を行うことができますが、代わりにビジター パターンが必要です。
内部でビジターを呼び出すのではなく、関数が外部で反復できる範囲を返す最初のようなことを行う方法はありますか?
(そして、 a を作成しstd::vector<Foo>
て返すという意味ではありません。インプレース列挙である必要があります。)
Boost.Range ライブラリがソリューションに関与していると思われることは知っていますが、特に詳しくはありません。
この種のことを行うためにカスタムイテレータを定義することが可能であることも認識しています(これも答えに関係していると思われます)が、書きやすいもの、理想的には示されている例よりも複雑ではないものを探していますここにあり、構成可能です(のように_SomeOtherCollection
)。
必要に応じて内部でラムダを使用することは気にしませんが (ただし、ラムダを使用することは避けたいと思います)。
c++ - boost::range を使用したインデント解除アルゴリズムの作成
テキスト エディター用のインデントなしアルゴリズムを作成しています。操作する範囲を取得できましたが、Gtk::TextBuffer::erase を実行しようとすると失敗します。
TextEditor.cpp:501:31: エラー: 'boost::range_detail::join_iterator >、Gtk::TextIter、unsigned int、unsigned int、boost::iterators::bidirectional_traversal_tag>、Gtk::TextIter、unsigned からの実行可能な変換がありませんint, unsigned int, boost::iterators::bidirectional_traversal_tag>' to 'const iterator' (aka 'const Gtk::TextIter') buffer->erase(spaceRange.begin(), afterRangeLine.end()); ^~~~~~~~~~~~~~~~~~ /usr/include/gtkmm-3.0/gtkmm/textiter.h:145:7: 注: 候補コンストラクター (暗黙のコピー コンストラクター) は実行できません: 'boost::range_detail::join_iterator >、Gtk::TextIter、unsigned int、unsigned int、boost::iterators::bidirectional_traversal_tag>、Gtk::TextIter、unsigned int、unsigned int、boost::iterators からの既知の変換はありません: :bidirectional_traversal_tag>
何か案は?
c++ - boost::spirit と boost::any_range を組み合わせますか?
この関数boost::spirit::qi::parse()
は、入力範囲を定義するために 2 つの反復子を想定しています。std::string
またはから解析しようとすると、これはうまく機能しますstd::istream
。ここで、パーサー用により汎用的なインターフェイスを実装したいと考えています。1 つのアプローチは、 を使用boost::any_range
して入力を定義することでした。これがコンパイルされたが例外をスローする私のテストコードです: "string iterator not dereferencable"
.
2 番目の質問です。boost::any_range
と組み合わせてboost::spirit::classic::position_iterator
エラーの可能性のある位置を検出するにはどうすればよいですか?
アップデート
1.) デフォルトで構築されたsEnd
反復子に誤りがあることに同意します。multi_pass
したがって、例を単純化しましたが、イテレータの使用方法を誤解していると思います。この場合c0
はfalse
(予期される) であり、(予期さc1
れtrue
ない) です。multi_pass
では、イテレータを使用する正しい方法は何ですか?
2.) はい、入力反復子の型ごとに新しい文法インスタンスをコンパイルできます。私のアイデアは、実装の詳細 (= ) をユーザーから隠し、boost::spirit
汎用インターフェースをユーザーに提供することでした。したがって、テンプレート関数は避けたいと思います。
3.) はい、属性を公開するのを忘れていました。これは簡単で汚い例にすぎません。ヒントをありがとう。