問題タブ [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 ::functiontypedefのパラメータ名
私は次のstd::function
ようにtypedefできることを知っています:
より自己文書化するために、typedefでパラメーター名を指定することは許可されていますか?例えば:
パラメータ名を追加でき、Visual C ++ 2010で正常にコンパイルされますが、C ++ 03 / C++11標準で許可されていることを確認したかったのです。
javascript - std::function を JavaScript V8 にバインドするには?
JavaScript V8を使い始めたばかりで、 Embedder's Guideから基本的な例をコンパイルしました。次に、C++ 関数を JavaScript コンテキストにバインドします。
今のところ、後でバインドを処理する必要がある、多かれ少なかれ空のクラスしかありません。
std::function
オブジェクトを JavaScript V8 コンテキストにバインドするにはどうすればよいですか?
c++ - std::function からこのポインタを取得するには?
std::function
メンバ関数を保持できるため、オブジェクト インスタンスへのポインタをどこかに格納する必要があります。
メンバー関数を保持するthis
からポインターを取得するにはどうすればよいですか?std::function
c++ - std::function に格納されたキャプチャ句を含むラムダを生の関数ポインタに変換します
私の最後の最近の質問は残念ながら言葉遣いであり、私のものとは別の問題の解決策になったので、ここで私は実際の問題を明確な方法で定式化しようとします.
始める前に、補足として、私は Javascript Engine V8 を C++ アプリケーションに統合しています。例のすべての型はここから来ています。それが、最終的に生の関数ポインターが必要な理由でもあります。しかし、これについては以下で詳しく説明します。
[=]
クラス内から、タイプのパラメーターとしてキャプチャー句を含むラムダ式std::function
を別の関数に渡し、そこで生の関数ポインターにキャストする必要があります。
このコードでInvocationCallback
は、 はシグネチャを持つ関数の単なる typedef ですHandle<Value>(Arguments const &)
。
すべてのラムダ式も同じシグネチャを持っています。この例でHandle<String>
は と互換性があることに注意してください。Handle<Value>
これも Javascript Engine V8 によって提供されます。
C++ では、このラムダをstd::function
上記の関数に渡すことができます。しかし、ラムダ式はそれが参照するオブジェクトへの参照も格納していると思います。で指定されたアクセスを何らかの方法[=]
で実現する必要があります。std::function
これが、生の関数ポインターへのキャストが失敗する理由である可能性があります。
コンパイル時エラーも実行時エラーもありませんが、デバッガーは結果が null ポインターになることを通知します。しかし、さらに処理するには生の関数ポインタが必要です。std::bind
最初に参照またはthis
ポインターを指定した後、ラムダを変換できると思います。
更新:ラムダから状態を取得することは不可能に思われるため、これを試しました。コンパイルfunction
されますが、null ポインターになります。
c++ - C++: std::function を使用して multiset にタプルを挿入し、順序を維持する
簡単に言うと、このコードの何が問題なのですか?
を使用してコンパイルg++ 4.7.2
- コマンドを使用して単純にg++ -std=c++11 main.cpp
なぜ私はこれをしたいのですか?
プログラムはリアルタイムで実行され、関数には呼び出されadd_even_handler
た型の値が含まれます(ここでの変数は、時計や実際の時間とは関係がないことに注意してください。これは double 型の増加するオブジェクトにすぎません)。したがって、ユーザーがイベントを追加すると、特定の時間に呼び出されます。double
time
time
標準の下の multiset コンテナーは、オブジェクトをある順序で照合します (通常、常にではありませんがstd::less<T>
)。次に、コンテナをループして、Event
variable の変更が増加したときに を呼び出すことができましたdouble time
。
何が問題ですか?
KyleC が指摘したように (彼の回答を参照)、std::function<>
コンパイラはどのプロセスを注文するかを理解していません。
私がどのように問題を克服したか
あなたは毎日何か新しいことを学びます。上記のコードは、最初に と を混ぜて問題を考えすぎた結果std::multiset
ですstd::tuple
。std::map<T,S>
orは、この場合は typeでstd::multimap<T,S>
ある関連によってソートされます。これは、標準ではデフォルトで再びです。上記の代わりに、次のようなことをしましたkey
double
std::less<T>
これは、明らかではありますが、人々を助ける可能性がある場合に備えて、ここに書かれています.
c++ - std::function へのポインタを受け入れる関数へのポインタを関数オブジェクトに渡す
タイプは異なるが同一のシグネチャのファンクターをメソッドに渡したいと思います。したがって、 std::function を使用する必要があると結論付けました。ただし、このメソッドは関数オブジェクトへの参照も格納する必要があるため、代わりに shared_ptr を渡したいと思います (有効期間管理のため)。以下のコードは、クラス B (b.run(...)) では機能しますが、クラス A ではコンパイルに失敗します (a.run(...) が壊れます)。関数オブジェクト自体の代わりにポインターが渡された場合のこの変換の問題の理由は何ですか?どうすれば回避できますか?
コンパイラ エラー:
MyFunctor が std::function から継承する場合、 a.run(...) がコンパイルされることがわかりました。
なぜ今これが機能するのですか?ファンクターでコードの変更が必要ない場合は、もっといいでしょう。
c++ - ラムダで pthread を起動する
私の手に負えない理由により、スタックサイズを減らした pthreads を使用する必要があります。std::async
しかし、私はまだ C++11 にアクセスできるので、future を返さずに pthread をデタッチ状態で起動し、任意の関数を実行できるようなものを書きたいと思いました。基本的に、void を返す関数には std::async を使用します。
私は次のコードを思いつきましたが、それは本当に醜いです。これについてもっと良い方法があるかどうか疑問に思っています。