問題タブ [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::関数の使用` 非 void 関数を呼び出す
少し前に、私はstd::function
このようにかなり使用しました:
基本的に、さまざまな関数オブジェクトを に格納したかったのでこれを行いましたstd::function
が、これらの関数の戻り値の型を制限したくありませんでした。これはうまくいくように見えたので、私はそれに行きました。しかし、私はそれが安全に使用できると確信しておらず、それに関するドキュメントを見つけることができませんでした. この使用法が正当かどうかは誰にもわかりませんか? または、より一般的には、に安全に割り当てることができるオブジェクトのルールは何std::function
ですか?
編集
明確にするために、私が懸念している問題は、ラムダ関数が戻り値の型で宣言されてint
いる間、を返すことです。特に呼び出しが行われると、これで問題ないかどうかわかりません。func
void
func()
c++ - C ++:std::bindの結果の引数を取得します
まず、少し背景があります。私の仕事では、後で呼び出されるようにコールバックをバインドします。これにより、ログを介した制御フローの追跡が非常に困難になる可能性があります。これを支援するために、「ログコンテキスト」を使用します。これにより、システムを通過するリクエストを追跡できます。静的関数を使用して現在のコンテキストをコピーし、静的関数log_context::get_current
を使用して復元できますlog_context::set_current
。これにより、コールバックをワーカーキューに投稿するたびに、多くのコードが繰り返されることになります。
ドロップインの代わりとstd::bind
なる関数を作成して、現在の関数を保存し、log_context
呼び出されたときに復元したいと思います。しかし、私はそれを書くのに苦労しています。
現在、関数は次のようになっています。
それは機能しますが、問題は、実際の理由なしに関数型を渡す必要があるということです(それ以外は、何を使用するかを見つける方法ですTFuncArgs
):
したがって、ドロップインの代替品ではありません。コンパイル時にこの情報を知っておく必要があるようですが、どうすればよいかわかりません。ほぼそこにあります。 関数のタイプを渡す必要をなくすにはどうすればよいですか?
私の最初の考えは、バインディングを次のような関数に変換することから分割することでした。
問題は、キャスト(operator std::function<TReturn (TFuncArgs...)>() const
)が(与えられたint foo(int x, int y, int z)
)と呼ばれることは決してないということです。
その理由は、コンストラクターが(持っていなくても)からfunction
取得しようとしているためです。operator ()
context_binder
したがって、このほぼ解決策に対する私の質問は、のコンストラクターを使用する代わりに、キャストアウト演算子を優先する方法はありますか?g++
function
c++ - APIにstd::functionを使用する(モジュールの境界を越えて)
私はこれに対する答えを知っていると確信していますが(いいえと思います)std::function
、APIで(モジュールの境界を越えて)値で安全に受け入れ/返すことができますか?
std::function
あるベンダーの実装が他のベンダーの実装と互換性があるという保証はないと思うので、私は「いいえ」と考えています。そうですか?
私が思うに答えがノーなら、あなたはこの種のことをどのように扱いますか?私は自分自身を実装することに頼らなければならないかもしれませんし、あるいはすべて一緒のようなことを避ける必要があるかもしれませんstd::function
(例:関数ポインターまたは関数型を操作する)。:-(私は以前に多くの場合それを行っていることに気づきました(多くの標準C ++ライブラリを再発明し、残念ながら、範囲ctorと塗りつぶしctorの両方をサポートする独自のSTL準拠のベクトル型、カスタムアロケータなどを作成しました。確かに面白くなかったし、標準の実装と同じくらい良かったとは思えない)たとえば、MSVC2010のstd::functionの実装がmingwで記述されたバイナリからあるライブラリに動的にリンクする可能性があるためです。
もちろん、別の方法は、APIでこれらの種類のC ++機能をまったく使用せず、たとえばCインターフェイスを使用することですが、APIを中央のAPIとして使用するため、かなりのコストがかかります。内部開発とサードパーティ開発の両方。
c++ - std ::functionparamsとして渡されるC++11ラムダ-リターンタイプでのディスパッチ
シナリオ:
一般的なエラー処理インターフェースを備えたAPIがあります。これはCAPIであるため、API関数が呼び出されるたびに、次のような定型文を実行する必要があることがわかります。
あなたは明らかに自分自身を繰り返すのが嫌いなので、この処理を次のようなコードを記述できるマクロにカプセル化する必要があります。
アスペクト指向プログラミングの観点からもこれを考えることができます-マクロがロギングを追加し、リモートモニターに情報を送信することを想像してください...要点は、式をカプセル化し、その周りで何でもして、戻ることになっているということです式が返すタイプは何でも-そしてもちろん、式は何も返さないかもしれません。
つまり、あなたはただすることはできません
...場合によっては、式が何も返さないためです。
それで...どうしますか?
マクロ内にステートメント全体をカプセル化することを提案しないでください...
...これは次のようなものでは機能しないため:
...あなたはすべてのifステートメントを飲み込みますか?そのアクションには他のAPI呼び出しが含まれているので、マクロ内のマクロ?デバッグは地獄になりました。
ラムダとstd::functionを使用した私自身の試みは以下のとおりですが、間違いなく醜いです...式のラムダをstd :: functionを使用するテンプレートに直接渡すことはできませんでした(ラムダの戻り値に基づいて特殊化するため)タイプ)なので、コードはかなり厄介であることがわかりました。
もっと良い方法を考えられますか?
UPDATE、KennyTMの優れたソリューションの補遺
この質問をトリガーした実際のOpenGLコードをここに配置しました。ご覧のとおり、エラーチェックコードは単に印刷するだけでなく、ユーザーコードが処理できる例外もスローしました。この補遺を追加して、KennyTMのソリューションでは、デストラクタからこの例外をスローすることになり、これで問題がないことに注意してください(続きを読む)。
このデストラクタからスローしても問題がない理由は、C++FAQで説明されています。
C ++の規則では、別の例外の「スタックアンワインド」プロセス中に呼び出されているデストラクタから例外をスローしてはなりません...別の例外の処理中にデストラクタから例外をスローしないと言うことができます。
この場合、(特別なマクロを呼び出す)ユーザーコードで例外を処理する必要があります。したがって、ErrorCheckerのデストラクタでの「スロー」が最初のものであること、つまり、呼び出された実際のCAPIがスローできないことを確実に知る必要があります。これは、次のフォームで簡単に実行できます。
この形式のマクロは、実際のC API(VA_ARGSを介して呼び出される)がスローされないことを保証します。したがって、ErrorCheckerのデストラクタの「スロー」が常に最初にスローされます。
したがって、このソリューションは私の元の質問のすべての角度をカバーします-それを提供してくれたAlexanderTurnerに感謝します。
c++ - C++ : noob のファンクタと std::function
単純な問題がありますが、C++ でファンクターを使用したことがないため、解決方法がわかりません。
私はそのようなことをしたいです(それは単なる例です):
functors/std::functions を使用する正しい構文は何ですか?
どうもありがとうございました !
c++ - C++11: 異なる型の std::functions のターゲットにアクセスする方法は?
最小限のマルチキャスト デリゲート クラスをコーディングしたいと考えています。そのインターフェースは、デリゲートを呼び出すための operator() と、関数、メソッド、ラムダ、ファンクターなどの呼び出し可能な型を追加/削除するための operator+=/operator-= の 3 つの演算子で構成されます。
除去のために関数ターゲットのアドレスを比較する必要があるところに operator-= を実装するのに問題があります。これが私がこれまでに思いついたものです(私はg ++ 4.6.3を使用しています):
operator-= は、TODO 行を次のコードに置き換えると、関数に対して機能します。
最小限の例を次に示します。
ただし、 std::function.target() が null ポインターを返すため、他の呼び出し可能な型ではクラッシュします。明らかに、テンプレートはもう適合しないため、Event::operator-= をテンプレート化しようとしましたが、「不完全な型」のため、最も呼び出し可能な型に対してコンパイルされません。
target() のテンプレート パラメータとして T* も試しましたが、行き詰まりました。呼び出し可能な型を正しく比較できるジェネリック operator-= をコーディングすることは可能ですか?
前もって感謝します!
c++ - std::function 引数に const ref を強制する
std::function パラメーターを取る関数があります。std::function に bool& 引数を持たせたい:
しかし、ref 制約は適用されません。
また
コンパイラはMSVC2010です。
注意
最初の例では bool に const ref を使用しました。これは、bool 変数が別のスレッドで変更され、ref の値を追跡する必要があるためです。そして、ラムダでは変更できないため、const.
c++ - std::function 呼び出しシグネチャからテンプレート引数を推測する
このテンプレート関数を考えてみましょう:
ReturnT
渡された呼び出しシグネチャからコンパイラが推測できないのはなぜですか?
c++ - Fast Delegate (その他) の背後にあるアイデアは、std::function を最適化するために使用されていますか?
よりもオーバーヘッドが低い C++ の「デリゲート」の提案がありましたboost::function
。
これらのアイデアのいずれかを実装するために使用したstd::function
結果、 よりも優れたパフォーマンスが得られましたboost::function
か? std::function
vsのパフォーマンスを比較した人はいboost::function
ますか?
Intel 64 ビット アーキテクチャの GCC コンパイラと libstdc++ について具体的に知りたいのですが、他のコンパイラ (Clang など) に関する情報も大歓迎です。
c++ - C++11 std::function と完全転送
C++ 標準の std::function<>::operator() の定義が次の理由:
ではない
?
パラメータを正しく転送するには、 && が必要でありstd::forward<ArgTypes>...
、呼び出しを転送するときに関数本体で使用すると思いますか?
これをテストするために std::function を部分的に再実装しましたが、&& を使用すると、後でパラメーターを値で operator() に渡そうとすると、g++ から「'xxx' 左辺値を 'xxx&&' にバインドできません」というメッセージが表示されることがわかりました。 . 右辺値/転送の概念については十分に理解できたと思いますが、まだこの点を理解できていません。私は何が欠けていますか?