問題タブ [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# - Marshal::GetFunctionPointerForDelegate: 結果をリリースする必要がありますか?
C++/CLI プロジェクト内でマネージド System.Action をアンマネージド std::function に変換しています。コールバックを使用した後、指定された IntPtr を解放する必要がありますか?それとも不要ですか?
c++ - 異なる引数を持つ std::function のコレクション
簡単なディスパッチャーを作成しようとしています。ユーザー コードはそれにコールバックをアタッチできます。各イベントには既知のシグネチャがあり、ユーザー コードは正しい番号と引数の型でディスパッチを呼び出す必要があります。これは可変引数によって管理されます。ただし、ベクトルが正しいタイプではないため、freestandingInt は受け入れられません。ジェネリックにする方法は?
最小限の例に従います
c++ - C++11 ラムダはどのように表現され、渡されますか?
c++11 では、ラムダを渡すのは非常に簡単です。
しかし、このような関数にラムダを渡すコストはいくらですか? func がラムダを他の関数に渡すとどうなるでしょうか?
ラムダの受け渡しは高価ですか? function
オブジェクトには0 を割り当てることができるため、
関数オブジェクトはポインタのように振る舞うと思います。しかし、を使用new
しないと、値型またはクラスのようになる可能性がありstruct
、デフォルトでスタック割り当てとメンバーごとのコピーになります。
関数オブジェクトを「値渡し」で渡す場合、C++11 の「コード本体」とキャプチャされた変数のグループはどのように渡されますか? コード本体の余分なコピーが多い?コピーが作成されないように、function
渡された各オブジェクトにマークを付ける必要がありますか?const&
それとも、関数オブジェクトは通常の C++ 構造体とは異なる方法で渡すのでしょうか?
c++ - unique_ptr 引数を持つ std::function
次のような関数が与えられた場合
次のようなファンクターを作成することはできません (MSVC 2012)
問題はバインドではありません-使用すると機能しauto f = std::bind(...)
ます。また、 a の使用shared_ptr
も機能します
- unique_ptr が許可されないのはなぜですか?
- これは MSVC の問題ですか、それとも一般的な C++11 の制限ですか?
- 関数定義を変更せずに回避策はありますか?
c++ - C++ 関数型
関数の型を理解するのに問題があります (たとえば、Signature
a のテンプレート パラメーターとして表示されますstd::function
)。
変数f
を割り当てることはできませんが、呼び出すことはできます。変。では、何の役に立つのでしょうか?
ここで、typedef を const 修飾しても、それを使用してさらに型を構築できますが、明らかにそれ以外の目的はありません。
ここで私は言語のどの隅にぶつかったのでしょうか? この奇妙な型はどのように呼び出され、テンプレート パラメーター以外で何に使用できますか?
c++ - std::function? を使用した非メンバー関数のオーバーロードにおける暗黙的な引数変換のあいまいさ
編集済み - 実際の問題がある編集にスキップしてください
スタンドアロン関数の文字列ヘルパー ライブラリで、 を受け取るバージョンと . を受け取るバージョンで関数のオーバーロードを提供する状況によく遭遇しchar
ますstd::string
。
問題は、文字列リテラル ( ) を渡すとオーバーロードがあいまいになることconst char*
です。
例:
これら 2 つの関数は異なる方法で実装されており、1 つは文字列用に最適化され、もう 1 つは単一の文字用に最適化されています。myFunc("literal")
ただし、常にバージョンを呼び出したいと思っていたにもかかわらず、呼び出そうとするとあいまいな結果になりstd::string
ます。
これvoid myFunc(const char *str)
により、次のようなスタブのみであるオーバーロードのバージョンを提供する必要があります。
これらのスタブ関数を不要にする方法はありますか? 「明示的」にできるようにしたいvoid myFunc(char c)
のですが、コンストラクター以外の非メンバー関数を明示的にすることはできません。これは問題を即座に解決します。=(...
(余談ですが、スタンドアロン関数を明示的にできないのはなぜですか?)
編集: プログラマーが夜遅くまでコーディングしすぎることについて彼らが言っていることをご存知でしょう! (冗談を覚えているなら教えてください。最初に聞いたときは眠すぎて忘れてしまったからです)
本当の問題
私はMinGW v4.7.2を使用していますが、問題は私の投稿が当初想定していたものとは大きく異なりました。
問題は、いくつかのオーバーロードがあることです。はい、この例は正常に動作します:
しかし、std::function オーバーロードを追加すると、次のように壊れます。
私の文字列ライブラリには、std::string、char、および std::function のオーバーロードがあります (場合によっては、多数のオプション パラメーターを使用して関数を単純化するためのオーバーロードがさらにいくつかあります)。
std::function をオーバーロードとして使用すると、次のエラー メッセージが表示されます。
myFunc(char) は、私が昨夜最初に混乱した方法です。コードからそのオーバーロードを削除すると、次のエラー メッセージが表示されます。
これは、自己完結型のコンパイル可能な例です。
文字列リテラルに std::function ではなく std::string を選択させるにはどうすればよいですか? std::function のコンストラクターはテンプレート化されており、特に関数ポインターを取るように設計されているため、おそらくあいまいです。
私の文字列ライブラリは、具体的には、すでに typedef されているstd::function<bool(char)>
andのみを使用std::function<bool(const std::string&)>
しているため、明示的なコンストラクターを使用してそれらをクラスに継承できます。
利用可能な他の提案やオプションはありますか?