問題タブ [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++ - boost::signals2 のバインディング クラス メンバー関数
std::bind を使用して、クラス メンバー関数を含むラムダを作成しましたが、boost::signals2 はそれを受け入れません。
を呼び出してCut
、新しいものがある場合に通知したいクラスがあります。Event
void Cut::newEvent(Event& e)
Cut のインスタンスへのラムダ バインディングを作成しましたが、Event を渡すと期待どおりに動作します。(コードはコンパイルされ、出力は「Registered new event」です。)
ただし、このラムダをインスタンスに接続しようとするboost::signals2::signal<void(Event&)>
と、次のメッセージが表示されます。
error: 'f' cannot be used as a function
main() の関数として使用できるため、これは奇妙です。std::function<void(Event&)>
( auto の代わりに使用しても同じ結果が得られます。
これを機能させることは可能ですか?現在機能していないのはなぜですか?
これは関連するコードです:
c++ - 非静的クラス メンバを Win32 コールバック関数 WNDPROC に「std::bind」するにはどうすればよいですか?
WNDPROC
非静的クラス メンバーを標準関数にバインドしようとしています。クラスメンバーを静的にすることで、これを簡単に実行できることはわかっています。しかし、C++11 STL の学習者として、<functional>
ヘッダーの下にあるツールを使用してそれを行うことに非常に興味があります。
私のコードは次のとおりです。
そのまま実行すると、次のエラー メッセージが表示されます。
c++ - std::shared_ptrs の std::reference_wrapper の並列
関数への参照をバインドする場合はf
、 を使用できますstd::bind(f, std::ref(x))
。この場合f
、参照を取得するか、コピーを作成します。
今私は関数を持っていますvoid g(T & t)
。入力引数を次のようにバインドしたいと思いstd::shared_ptr<T> mySharedPtr
ます: std::bind(g, mySharedPtr)
。mySharedPtr
これにより、のデータが少なくともバインドと同じだけ存続することが保証されます。ただしg
、参照を取るため、これは型チェックを行いません。
に渡す前にstd::ref
a を取り、それを逆参照するのに似たものはありますか? そうでない場合は、自分で作成できますか?std::shared_ptr
g
(ラムダを使用して回答する場合は、コンパイラがサポートしていないため、ラムダを使用しないものも含めてください。)
編集:std::bind(g, std::ref(*mySharedPtr))
の生涯保証が失われるため、機能しませんstd::shared_ptr
。
c++ - 派生クラスが明示的に呼び出す必要がないように、基本クラスのコンストラクターを std::bind できますか?
メンバーを初期化するためにコンストラクターに渡されるいくつかのオブジェクトを必要とする抽象基本クラスがあります。しかし、これらのオブジェクトを派生クラス コンストラクターを介して渡す必要はありません。
基本クラスに渡されるオブジェクトは、作成されたすべての派生クラスの同じインスタンスです。それらを基本クラスのコンストラクターにバインドして、派生クラスのコンストラクターを介して転送する必要がないようにする方法はありますか?
c++ - C++ std::bind は typename を最初の引数として受け入れます
私はいくつかの奇妙な行動に遭遇しました。
このコードは私にエラーを与えます:
入力として型名が好きでstd::bind
はないようです。これに対する回避策はありますか? 同じパラメーターを手動で使用std::bind
しても問題なく動作しますが、定型コードになります。
入力がなくても、コンパイル時にエラーが発生します。機能が動作しないのはなぜですか?
編集:助けてくれてありがとう。結局のところ、bind は型名を受け入れず、アドレスを受け入れます。
c++ - std::bind を使用して BinaryPredicate から UnaryPredicate を作成し、std::transform で使用する
私は最近、この使用法に遭遇しましたfor_each
:
まあ、それは動作します。Ts と T f のコンテナーの場合、これは各値を f で乗算します。ただし、ここでラムダを使用するのは嫌いです。短いですが、重複しているだけのようですstd::multiplies
。また、変更の意図を表すには、for_each
ではなく、しかし、とすべきです。transform
ただし、std::multiplies
二項述語でstd::transform
あり、単項述語が必要です。
f を 1 つのパラメーターとしてバインドしようとしましたが、どうやら使い方が間違っているようです。
GCC はエラー メッセージでヒントを提供しようとしますが、実際の原因はわかりません。
使い方がstd::bind
間違っているのではないかと疑っています。私の間違いは何ですか?
c++ - std::bind には、その結果に対してブーストのようなオーバーロードされた演算子がありますか?
Boost には、boost::bind 結果タイプのオーバーロードされた演算子があります。So!bind(f, ...)
は と同等bind( logical_not(), bind(f, ...) )
です。||、&& などの他の演算子も使用できます。std::bind には同じ機能がありますか? 使えます!std::bind(...)
か?std::not1
c ++ 11では非推奨ですか?