問題タブ [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.

0 投票する
1 に答える
1486 参照

c++ - ブーストシグナル自動切断ラムダスロット

私はこれをやろうとしています:

これにより問題が発生しますか?

接続 c は、接続後にのみ割り当てられます。

ラムダは接続前に初期化する必要があります。

値によるキャプチャは機能しないようです。ただし、c はローカル変数にすぎないため、参照によってキャプチャすることはできません。

ラムダでない場合は、「somesignal」をキャプチャして、somesignal.disconnect(slot) を呼び出すことができます。ただし、ラムダの場合、スロットはそれ自体です。

0 投票する
2 に答える
2134 参照

c++ - boost::signals2 は単純なアプリケーションではやり過ぎですか?

に制限された環境では、コンポーネント間でシンプルなメッセージング システムを実装するためにC++03boost::signals2使用されました。それはうまく機能し、まったく問題はありません。boost::functionboost::bind

しかし、完全にサポートされている別の環境では、非常に単純なアプリケーションではやり過ぎでしょうか?C++11boost::signals2

明確にするために、簡単に言うと、次のことを意味します

  • シングルスレッド
  • すべてのシグナルには戻り値の型がありますvoid

このアプリケーションではパフォーマンスが重要であるため、アプリケーションboost::signals2必要としないすべての驚異は、利益よりも害を及ぼす可能性があります。

現時点では、これを処理するだけで、適切と見なされた場合に非常に簡単に実行できるstd::vector<std::function>ような別のものに切り替えることができます。boost::signals2

0 投票する
1 に答える
447 参照

c++ - variadic メンバー関数をファンクターにバインドするにはどうすればよいですか?

std::bind を使用して可変引数関数の最初のパラメーターをバインドし、返されたファンクターを boost::signals2::signal の connect() 関数に渡そうとしています。可変個引数関数がメンバー関数でない限り、プロセスは正常に機能します。これは私ができるようにしたいことです:

コンパイルすると、「... への呼び出しに一致するものがありません」というエラーが表示されます。ここで、... は、バインドする呼び出しのテンプレート化された型に入力されます。call_var_callback() の定義を「テスト」オブジェクトの範囲外に移動すると、すべてが機能します。ただし、私の実際のコード ベースでは、バインドされた関数がクラスのメンバーである必要があります。これは、状態を一緒に運ぶためです。

どうぞよろしくお願いいたします。

0 投票する
1 に答える
655 参照

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 で次の関連スレッドを見つけましたが、私の質問に答えるものはないようです。

  1. boost::signals2 ライブラリをリンクするときの undefined-reference
  2. ヘッダーのみのライブラリを使用する場合のブースト リンカー エラー
  3. 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

0 投票する
2 に答える
999 参照

c++ - ブースト シグナルを持つ C++ テンプレート クラス2

C++ テンプレートでブースト信号とスロットを使用しようとしています。コード例は次のとおりです。

コンパイルすると、次のような (コンパイル) エラーが発生します。

  1. typedef テンプレートが不正です
  2. 構文エラー: ';' がありません 識別子「Sig_t」の前

テンプレートでブースト信号を使用する際に制限はありますか? 参考までに - 私は C++11 を使用していません。

どんな提案/助けも大歓迎です。

0 投票する
1 に答える
553 参照

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)> >&)、成功しませんでした。

私は何かを監督しましたか?

0 投票する
2 に答える
444 参照

c++ - ポインターを boost::signals2 に接続する

どういうわけか、ポインターをboost::signals2::signalに接続できるかどうか疑問に思っていました。私の問題は次のとおりです。「信号」に接続されているオブジェクトを変更したい。例えば ​​:

コードは常に出力します:

×は:3

そして、私はそれを出力したいと思います

×は:2

今、簡単な解決策か、boost::signals2 の目的をよく理解しているかのいずれかが欠けているように感じます。