問題タブ [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++ - メソッド引数の std::function、copy または shared_ptr?
std::function をコールバック ハンドラとして使用しようとしています。
このような、
この例では、参照渡しを使用しました。
しかし問題は、関数がプログラムの非同期コンテキストで実行されるため、std::function
オブジェクトがまだ存在することを保証できないことです。callback
そのため、関数オブジェクトのライフサイクルを管理する必要があり、そのために 2 つの方法を考えました。
値渡し(コピー)の使用
使用して
std::shared_ptr
私のシステムでは のサイズがstd::function
24 バイトに固定されており、std::shared_ptr
8 であることを知っています。
ただし、コピーするstd::shared_ptr
と、参照カウンターを管理する追加のオーバーヘッドが発生します。(さらに、 の shared_ptr オブジェクトを作成するスマートできちんとした方法が見つかりませんstd::function
。)
どちらの方法でパフォーマンスが向上しますか?
c++ - アルゴリズム関数: テンプレートにするか、std::function パラメーターを取りますか?
Graph という C++ クラスがあり、アルゴリズム メソッド for_each_node() があります。次のように、テンプレートにすることもできます。
または、次のように std::function を使用します。
std::for_each などの標準アルゴリズムは最初のアプローチを使用しますが、gtkmm (GTK+ の C++ バインディング) などの一部のライブラリは、関数をそれらを含むオブジェクトの関数ポインターとして受け取ります。
各オプションの利点と欠点は何ですか? どちらを選択すればよいかわかりません。選択に影響を与えるもの: Graph クラスがクラス テンプレートかどうか、アルゴリズム メソッドで使用されると予想されるさまざまな関数の数、または速度要件。
c++ - C++11 より前の std::function に似たものはありますか?
std::function<>
C++11 が利用できない場合の代用として、どの構造を使用する必要がありますか?
代替手段は、基本的に、以下の例のように、あるクラスのプライベート メンバー関数に別のクラスからアクセスできるようにする必要があります (std::function の他の機能は使用されません)。クラス Foo は固定されており、あまり変更できません。クラス Bar にしかアクセスできません。
c++ - Clang++ は、std::function とラムダについて、メモリをリークする実行可能ファイルを生成します
ArchLinux (i686) 上の Clang++ 3.2 を使用して、次の C++11 コードをビルドします。
clang++ test.cpp -std=c++0x && valgrind --leak-check=full --log-file=tmp.log.memcheck ./a.out
それから私は得る
そのコードに問題があるかどうか (そして 1 バイトのリークが発生するだけかどうか) はわかりませんが、g++ 4.7 を使用してコンパイルすると、メモリ リークは発生しません。それについて何か提案はありますか?
c++ - 渡された値を返すだけのデフォルト関数?
怠惰な開発者として、私はこのトリックを使用してデフォルトの関数を指定するのが好きです。
しかし、私は非常に特殊なケースで問題を抱えています。それは次のとおりです。
この場合、デフォルトの関数を次の関数と同等にしたいと思います[](const unsigned int i){return i;}
(渡された値を返すだけの関数)。
そのためには、との代わりに何を書く必要が/*SOMETHING 1*/
あり/*SOMETHING 2*/
ますか?
c++ - 奇妙なテンプレート構文
gcc-4.7.2のソース コードを調べていて、std::function
理解std::bind
できないメンバー関数ポインターに使用される構文に出くわしました。
私が理解していないのは、次の専門化です_Maybe_wrap_member_pointer
:
_Tp
と の間にコンマがないのはなぜ_Class::*
ですか?メンバー関数
void foo::bar()
(以下のサンプル アプリ) を考えると、ここで何を_Tp
解決_Class::*
するのでしょうか?
以下は、メンバー関数ポインターとオブジェクトをバインドするサンプル アプリです。std::bind
(メンバー関数の特殊化/内部に関連するソースコードを引き出しました)
c++ - C++任意の関数をDLLからstd::functionに動的にロードします
単一の関数を使用して、任意のダイナミックリンクライブラリ(dll)関数をオブジェクトにロードするにはどうすればよいですか?std::function
たとえば、2つの関数をdllにコンパイルしたいと思います。
そして、次のような単一の関数を使用して、実行時に両方をロードします。
c++ - 関数ポインターでカバーされていない std::function のユースケースはありますか、それとも単なる構文糖ですか?
std::function の表記は、関数ポインターと比較すると非常に優れています。ただし、それ以外に、ポインターに置き換えられなかったユースケースは見つかりません。では、関数ポインターの構文糖衣にすぎないのでしょうか?
c++ - 任意のポインタ型または基本クラスを関数typedefに渡すことができますか
私はこのコードを持っています
そして、barがClassXの代わりにClassXを拡張するClassYを取得するまでは正常に機能します。
コンパイル時エラーが発生します:main.cpp:22:9:「createCaller」の呼び出しに一致するメンバー関数がありません
問題は、barがClassXまたは任意のクラスを拡張する任意のクラスのパラメーターを取得できるようにするにはどうすればよいですか?それも可能ですか?
c++ - 述語のテンプレートの代わりに std::function
多くの標準ライブラリ アルゴリズムは述語関数を取ります。ただし、これらの述語のタイプは、任意のユーザー提供のテンプレート パラメーターです。std::function
代わりに、C++11 がこれらが特定の型を取ることを指定しないのはなぜですか? 例えば:
引数の型としてテンプレートの代わりにこれを使用していませんか?