問題タブ [boost-signals2]
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++ - ブーストシグナル自動切断ラムダスロット
私はこれをやろうとしています:
これにより問題が発生しますか?
接続 c は、接続後にのみ割り当てられます。
ラムダは接続前に初期化する必要があります。
値によるキャプチャは機能しないようです。ただし、c はローカル変数にすぎないため、参照によってキャプチャすることはできません。
ラムダでない場合は、「somesignal」をキャプチャして、somesignal.disconnect(slot) を呼び出すことができます。ただし、ラムダの場合、スロットはそれ自体です。
c++ - boost::signals2 は単純なアプリケーションではやり過ぎですか?
に制限された環境では、コンポーネント間でシンプルなメッセージング システムを実装するためにC++03
がboost::signals2
使用されました。それはうまく機能し、まったく問題はありません。boost::function
boost::bind
しかし、完全にサポートされている別の環境では、非常に単純なアプリケーションではやり過ぎでしょうか?C++11
boost::signals2
明確にするために、簡単に言うと、次のことを意味します。
- シングルスレッド
- すべてのシグナルには戻り値の型があります
void
このアプリケーションではパフォーマンスが重要であるため、アプリケーションがboost::signals2
必要としないすべての驚異は、利益よりも害を及ぼす可能性があります。
現時点では、これを処理するだけで、適切と見なされた場合に非常に簡単に実行できるstd::vector<std::function>
ような別のものに切り替えることができます。boost::signals2
c++ - variadic メンバー関数をファンクターにバインドするにはどうすればよいですか?
std::bind を使用して可変引数関数の最初のパラメーターをバインドし、返されたファンクターを boost::signals2::signal の connect() 関数に渡そうとしています。可変個引数関数がメンバー関数でない限り、プロセスは正常に機能します。これは私ができるようにしたいことです:
コンパイルすると、「... への呼び出しに一致するものがありません」というエラーが表示されます。ここで、... は、バインドする呼び出しのテンプレート化された型に入力されます。call_var_callback() の定義を「テスト」オブジェクトの範囲外に移動すると、すべてが機能します。ただし、私の実際のコード ベースでは、バインドされた関数がクラスのメンバーである必要があります。これは、状態を一緒に運ぶためです。
どうぞよろしくお願いいたします。
c++ - 単純なプログラムでの boost::signals2 リンカ エラー
Boost.Signals2 を使用した実験で、次の非常に素朴なプログラムをコンパイルしようとしました。プログラムはコンパイルされましたが、リンカー エラーが発生しました (エラー メッセージについては、この質問の下部を参照してください)。
エラーが発生した理由とその修正方法
( 2014 年 9月 17 日の更新:この問題はまだ解決されていません。このプログラムは、Windows XP では GCC4.9 と Code::Blocks、Mac OS X Mavericks では Clang と Xcode 5 を使用して正常にビルドできますが、いくつかの不可解な理由によりMac OS X で GCC4.9 と Eclipse を使用してプログラムをビルドすると、リンク エラーが解消されません。)
SO で次の関連スレッドを見つけましたが、私の質問に答えるものはないようです。
- boost::signals2 ライブラリをリンクするときの undefined-reference
- ヘッダーのみのライブラリを使用する場合のブースト リンカー エラー
- boost.signals2 ライブラリをビルドする必要がありますか?
エラーメッセージは次のとおりです。
make all
Building file: ../src/hello.cpp
Invoking: GCC C++ Compiler
/usr/local/bin/g++-4.9 -I/usr/include -I/usr/local/include -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/hello.d" -MT"src/hello.d" -o "src/hello.o" "../src/hello.cpp"
Finished building: ../src/hello.cpp
Building target: hello
Invoking: MacOS X C++ Linker
/usr/local/bin/g++-4.9 -L/usr/local/lib -L/usr/lib -o "hello" ./src/hello.o
Undefined symbols for architecture x86_64:
"std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)", referenced from:
void std::list<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> >, std::allocator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> > > >::_M_insert<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> > const&>(std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> > >, boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (), boost::function<void ()> >, boost::signals2::mutex> > const&) in hello.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [hello] Error 1
c++ - ブースト シグナルを持つ C++ テンプレート クラス2
C++ テンプレートでブースト信号とスロットを使用しようとしています。コード例は次のとおりです。
コンパイルすると、次のような (コンパイル) エラーが発生します。
- typedef テンプレートが不正です
- 構文エラー: ';' がありません 識別子「Sig_t」の前
テンプレートでブースト信号を使用する際に制限はありますか? 参考までに - 私は C++11 を使用していません。
どんな提案/助けも大歓迎です。
c++ - ブースト::シグナル2; 信号スロットを追加するためのマッチング機能なし
boost::signals2 に問題があるプロジェクトがあります。簡単な例を示すために、コードを次の 3 つのクラスに短縮しました (すべてのクラスが簡略化されています)。
コンパイル中に、常に次のエラーが表示 されます: 'Plugin::addEventHandler(boost::_bi::bind_t, boost::_bi::list2, boost::arg<1> > >)' の呼び出しに一致する関数はありません
さて、エラーは単純です: コンパイラは、同じ型とパラメータの数を持つ関数を見つけられませんでした. 正確なタイプのオブジェクトを定義してそれをバイパスしようとしましたがPlugin::EventHandler
(それ自体は typedef ですboost::signals2::slot1<void, SignalArgs, boost::function<void(SignalArgs)> >&
)、成功しませんでした。
私は何かを監督しましたか?
c++ - ポインターを boost::signals2 に接続する
どういうわけか、ポインターをboost::signals2::signalに接続できるかどうか疑問に思っていました。私の問題は次のとおりです。「信号」に接続されているオブジェクトを変更したい。例えば :
コードは常に出力します:
×は:3
そして、私はそれを出力したいと思います
×は:2
今、簡単な解決策か、boost::signals2 の目的をよく理解しているかのいずれかが欠けているように感じます。