問題タブ [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.

0 投票する
2 に答える
1507 参照

c++ - std ::functiontypedefのパラメータ名

私は次のstd::functionようにtypedefできることを知っています:

より自己文書化するために、typedefでパラメーター名を指定することは許可されていますか?例えば:

パラメータ名を追加でき、Visual C ++ 2010で正常にコンパイルされますが、C ++ 03 / C++11標準で許可されていることを確認したかったのです。

0 投票する
2 に答える
1998 参照

javascript - std::function を JavaScript V8 にバインドするには?

JavaScript V8を使い始めたばかりで、 Embedder's Guideから基本的な例をコンパイルしました。次に、C++ 関数を JavaScript コンテキストにバインドします。

今のところ、後でバインドを処理する必要がある、多かれ少なかれ空のクラスしかありません。

std::functionオブジェクトを JavaScript V8 コンテキストにバインドするにはどうすればよいですか?

0 投票する
1 に答える
1462 参照

c++ - std::function からこのポインタを取得するには?

std::functionメンバ関数を保持できるため、オブジェクト インスタンスへのポインタをどこかに格納する必要があります。

メンバー関数を保持するthisからポインターを取得するにはどうすればよいですか?std::function

0 投票する
2 に答える
6876 参照

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 ポインターになります。

0 投票する
1 に答える
953 参照

c++ - C++: std::function を使用して multiset にタプルを挿入し、順序を維持する

簡単に言うと、このコードの何が問題なのですか?

を使用してコンパイルg++ 4.7.2- コマンドを使用して単純にg++ -std=c++11 main.cpp

なぜ私はこれをしたいのですか?

プログラムはリアルタイムで実行され、関数には呼び出されadd_even_handlerた型の値が含まれます(ここでの変数は、時計や実際の時間とは関係がないことに注意してください。これは double 型の増加するオブジェクトにすぎません)。したがって、ユーザーがイベントを追加すると、特定の時間に呼び出されます。doubletimetime

標準の下の multiset コンテナーは、オブジェクトをある順序で照合します (通常、常にではありませんがstd::less<T>)。次に、コンテナをループして、Eventvariable の変更が増加したときに を呼び出すことができましたdouble time

何が問題ですか?

KyleC が指摘したように (彼の回答を参照)、std::function<>コンパイラはどのプロセスを注文するかを理解していません。

私がどのように問題を克服したか

あなたは毎日何か新しいことを学びます。上記のコードは、最初に と を混ぜて問題を考えすぎた結果std::multisetですstd::tuplestd::map<T,S>orは、この場合は typeでstd::multimap<T,S>ある関連によってソートされます。これは、標準ではデフォルトで再びです。上記の代わりに、次のようなことをしましたkeydoublestd::less<T>

これは、明らかではありますが、人々を助ける可能性がある場合に備えて、ここに書かれています.

0 投票する
2 に答える
749 参照

c++ - std::function へのポインタを受け入れる関数へのポインタを関数オブジェクトに渡す

タイプは異なるが同一のシグネチャのファンクターをメソッドに渡したいと思います。したがって、 std::function を使用する必要があると結論付けました。ただし、このメソッドは関数オブジェクトへの参照も格納する必要があるため、代わりに shared_ptr を渡したいと思います (有効期間管理のため)。以下のコードは、クラス B (b.run(...)) では機能しますが、クラス A ではコンパイルに失敗します (a.run(...) が壊れます)。関数オブジェクト自体の代わりにポインターが渡された場合のこの変換の問題の理由は何ですか?どうすれば回避できますか?

コンパイラ エラー:

MyFunctor が std::function から継承する場合、 a.run(...) がコンパイルされることがわかりました。

なぜ今これが機能するのですか?ファンクターでコードの変更が必要ない場合は、もっといいでしょう。

0 投票する
0 に答える
1057 参照

c++ - ラムダで pthread を起動する

私の手に負えない理由により、スタックサイズを減らした pthreads を使用する必要があります。std::asyncしかし、私はまだ C++11 にアクセスできるので、future を返さずに pthread をデタッチ状態で起動し、任意の関数を実行できるようなものを書きたいと思いました。基本的に、void を返す関数には std::async を使用します。

私は次のコードを思いつきましたが、それは本当に醜いです。これについてもっと良い方法があるかどうか疑問に思っています。