問題タブ [std-function]
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++ - g++:クロージャー型で初期化されたstd::関数は常にヒープ割り当てを使用しますか?
インターネット上の一部の情報源 (具体的にはthis one ) によると、std::function は小さなクロージャーの最適化を使用します。たとえば、クロージャーのサイズがデータの量よりも小さい場合はヒープを割り当てません (上記のリンクは gcc の 16 バイトを示しています)。
だから私はg ++ヘッダーを掘り下げました
そのような最適化が適用されるかどうかは、「機能」ヘッダーのこのコードブロックによって決定されるように見えます (g++ 4.6.3)
そしていくつかの行を下に:
たとえば、_Local_storage() が true_type の場合、placement-new が呼び出されます。それ以外の場合 - 通常の新しい
_Local_storage の定義は次のとおりです。
および __stored_locally:
最後に: __is_location_invariant:
そう。私が知る限り、クロージャー型はポインターでもメンバーポインターでもありません。小さなテスト プログラムを作成したことを確認するには、次のようにします。
出力は次のとおりです。
だから、私の質問は次のとおりです: std::function をラムダで初期化すると、常にヒープ割り当てが発生しますか? または私は何かを逃していますか?
c++ - std::function のメンバーへのポインター関数テンプレート パラメーターを宣言する '不完全な型' エラー
宣言は次のとおりです。
エラーが発生します
関数 'double fA(std::function)': tb.cpp:32:8: エラー: 'fp' の型が不完全です
問題ないのに
この型をテンプレート パラメータとして に提供する正しい方法は何std::function
ですか?
c++ - ここで、三項演算子が if-else と同じでないのはなぜですか?
TR1 を使用しstd::function
て単純なコールバック メカニズムを実装しています。コールバックされたくない場合はnullptr
、コールバック ハンドラとして登録します。これはコンパイルされ、正常に動作します:
これを三項演算子で書き直すと・・・
... VC++ のコンパイラは次のように述べています。
エラー C2446: ':': 'nullptr' から 'std::tr1::_Bind<_Result_type,_Ret,_BindN>' 1> への変換がありません 1>
[ 1> _Result_type=void, 1> _Ret=void, 1>
_BindN=std::tr1::_Bind2,Foo *,std::tr1::_Ph<1>> 1> ] 1> ソース型を取得できるコンストラクターがないか、コンストラクターのオーバーロード解決があいまいです
これはコンパイラの制限ですか、それとも私は愚かなことをしていますか? この特定のケースでは、三項演算子を使用しても何のメリットも得られないことはわかっていますが、ただ興味があります。
c++ - c ++でgslを使用するときに静的メンバー関数を回避する方法
メンバー関数を として宣言せずに C++ クラス内で GSL を使用したいと考えていstatic
ます。その理由は、私がそれらをよく知らず、スレッド セーフについてよくわからないためです。私が読んだことからstd::function
、解決策かもしれませんが、それを使用する方法がわかりません。
static
私の質問は、宣言でどのように削除できg
ますか?
更新 (1) :
に変更gsl_monte_function G = { &g, 3, 0 };
してみましgsl_monte_function G = { bind(&A::g, this,_1,_2,_3), 3, 0 };
たが、うまくいきませんでした
更新 (2) : std::function をメンバー関数に代入してみましたが、どちらも機能しませんでした。
更新 (3) 最後に、非メンバー関数を作成しました。
うまくいきましたが、ヘルパー関数を書く必要があったため、面倒な解決策です。ラムダ、関数、およびバインドを使用すると、クラス内ですべてを論理的にする方法が必要です。
c++ - ラムダを std::function に割り当てる
推論された戻り値の型が std::nullptr_t の場合、2 番目の代入が許可されるのはなぜですか? 関数ポインターでは、これは禁止されています。
2番目のラムダが実行されないのはなぜですか?
c++ - 関数へのポインターと std::function : 最初のものはコンパイルされ、2番目のものはコンパイルされませんか?
関数へのポインターに慣れていないため、現在いくつかのテストを行っています。しかし、次のプログラムでは、なぜ最初のバージョンが動作し、2 番目のバージョンがコンパイルされないのかがわかりません。正しい構文は何ですか?
エラーは次のとおりです。
c++ - c++がstd::functionを別のクラスからコンストラクターに渡す
メソッドをコンストラクターに渡していますが、別のクラスのメソッドを使用するとエラーが発生します。
現在、この形式で機能しています。
ただし、そのように別のヘッダーファイルのメソッドを参照すると、
実行時に次のメッセージでエラーが発生します。
私のハッシュマップコンストラクターは次のようになります。
ここで、hfuncはメソッドのtypdefです。
PrimeHashメソッドを持つHashFcnクラスがあります
typdef /メソッドの受け渡しを行うのはこれが初めてです-手がかりや助けがあれば大歓迎です!
c++ - GCC のバグかどうか: デフォルトの std::function?
クラスメンバーのパラメータとしてデフォルト関数を指定する方法は?
私のコードから派生した現在の例は次のとおりです。
GCCのバグですか?
別の構文でこの問題を回避することは可能ですか?
他の C++11 コンパイラで試すことはできますか (持っている人向け)。
c++ - std::function と Signal/Slot システム
ブーストなしでC++で単純なシグナル/スロットシステムを作成しようとしていますが、パラメーターで使用しようとするといくつかの問題が発生します。これが私のコードです:
私の信号クラス:
私のテストクラス:
だから、私は自分のクラスをそのように使います:
Signal.cpp に警告があります: Candidate function not viable: no known conversion from 'void (*)(int)' to 'int' for 1st argument;
このコードでは:
どうすれば解決できますか?「emit」メソッドにオブジェクトまたは倍数のパラメーターを指定したい場合、どうすればよいですか?
ありがとう!