問題タブ [stdbind]
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# または VB.NET で同等の std::bind
「同期」コード (つまり、Windows イベントを使用して、他のスレッドが何かを完了するまで待機する) を「非同期」コード (デリゲートを使用してコールバック メカニズムを実装する) にリファクタリングしています。
同期コードには、待機が終了した後に使用する必要があるローカル変数が含まれていることがあります。そのようなコードが非同期になると、それらのローカル変数は失われます (コールバック ハンドラーはそれらにアクセスできません)。クラス属性として保存できますが、もったいない気がします。
C++ では、std::bind
これを回避するために使用します。コールバック ハンドラーに必要なローカル変数と同じ数のパラメーターを追加し、非同期メソッドを呼び出すときにそれらをバインドします。たとえば、非同期メソッドのコールバックが 型のオブジェクトを受け取り、呼び出し元が型とCallbackParam
の 2 つのローカル変数を使用するとします。LocalA
LocalB
C# と VB.NET でこれに相当するものはありますか? デリゲートなどを使用していますか?
更新: 完全を期すために、@lasseespeholt の回答に基づいた私の例に相当する C# を次に示します。
c++ - ラムダで pthread を起動する
私の手に負えない理由により、スタックサイズを減らした pthreads を使用する必要があります。std::async
しかし、私はまだ C++11 にアクセスできるので、future を返さずに pthread をデタッチ状態で起動し、任意の関数を実行できるようなものを書きたいと思いました。基本的に、void を返す関数には std::async を使用します。
私は次のコードを思いつきましたが、それは本当に醜いです。これについてもっと良い方法があるかどうか疑問に思っています。
c++ - C++ での二項演算関数での std::bind の使用
std::bind の仕組みを学ぼうとしています。私は次のように書いた:
std::transform は二項演算関数も受け入れます。だから私は fun2 を書いて std::bind (メインの最後の行) を使用しようとしましたが、うまくいきません。std::bind がプレースホルダー (2,3 以上) を使用する方法の例を教えてもらえますか?
boost - ブーストでのバインドは機能しますが、std では機能しません。違いは何ですか?
std::bind で関数をバインドしようとしましたが、引数のセットにオーバーロードがないと言い続けました。boost::bind で動作しました。std と boost bind の違いは何ですか?
私は使用しています:
Microsoft Visual Studio Ultimate 2012 バージョン 11.0.60315.01 アップデート 2
ブースト 1.53.0
func 宣言とバインディング:
エラー:
105 IntelliSense: オーバーロードされた関数 "std::bind" のインスタンスが引数リストに一致しません, boost::asio::ip::tcp::socket *socketPtr, void (*onMessageReceivedCallback)(char *message, std::string hostname, int port, int length)), Messenger *, std::_Ph<1 >, std::_Ph<2>, char *, int, boost::asio::ip::tcp::socket , void ( )(char *message, std::string ホスト名, int ポート, int 長さ)) c:\Users\gospo_000\Source\Repos\Messenger\Messenger\Messenger\Messenger.cpp 176 4 メッセンジャー
このような多くのエラー:
エラー 81 エラー C2780: 'enable_if::value,std::_BindRx(_thiscall _Farg0::* )(_V0_t,_V1_t,_V2_t,_V3_t,_V4_t),_Rx,_Farg0,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t>,_Vx0_t ,_Vx1_t>>::type std::bind( Rx ( _thiscall _Farg0::* const )(_V0_t,_V1_t,_V2_t,_V3_t,_V4_t),_Vx0_t &&,_Vx1_t &&)' : 3 つの引数を想定 - 8 つの引数を指定 c:\ users\gospo_000\source\repos\messenger\messenger\messenger\messenger.cpp 176 1 tester2
Messenger.h
Messenger.cpp
c++ - このテンプレート コードでローカルまたはテンポラリを返すにはどうすればよいですか?
copy_if を、イテレータのペアを受け入れる関数オブジェクトにバインドしています。ローカル アドレスまたは一時アドレスを返しているという警告が表示されます。
私はそれが std::pair のメンバー変数をバインドすることから来ていることを知っているところまで来ましたが、それを修正する方法がわかりません。そもそもなぜそれらが一時的と見なされるのか理解できません。誰かが私に両方を説明できますか?
関連するコードは次のとおりです。環境は Visual Studio 2010 Ultimate で、あまり役に立たない Windows 7 Enterprise です。
その後、コードは次のようになります。
c++ - unique_ptr 引数を持つ std::function
次のような関数が与えられた場合
次のようなファンクターを作成することはできません (MSVC 2012)
問題はバインドではありません-使用すると機能しauto f = std::bind(...)
ます。また、 a の使用shared_ptr
も機能します
- unique_ptr が許可されないのはなぜですか?
- これは MSVC の問題ですか、それとも一般的な C++11 の制限ですか?
- 関数定義を変更せずに回避策はありますか?
c++ - std::bind と boost::bind の間に大きな違いがあるはずですか?
g++-4.7 (具体的には Ubuntu/Linaro 4.7.3-2ubuntu~12.04) での C++11 のサポートを調査していますが、違いを見つけているようです。
特に、 Boost ASIO 非同期クライアントの例 ( http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/http/clientから取得) の出現箇所をコメントアウトし#include <boost/bind.hpp>
て体系的に置き換えるboost::bind
と、 /async_client.cpp )、プログラムはコンパイルされなくなります。std::bind
これについての説明はありますか?
c++ - std::bind は、右辺値参照として配信されると参照を失います
次のコードがあります。
そして、それは出力します
これは、関数がへの参照ではなく のcallback
コピーを取得したことを意味します。完全転送である必要があるため、何が起こったのか疑問に思っています。t
t
std::bind