問題タブ [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 投票する
5 に答える
39887 参照

c++ - C++ で 'void' テンプレート引数を使用する

次の最小限の例を見てください。

2 番目の型エイリアスの場合、「引数に 'void' 型がない可能性があります」というエラーが表示されます。(Xcode 4.5、Clang/c++11/libc++、OS X 10.7 でテストしました。)

Type1これは奇妙だと思いますType2<void>。何が起きてる?また、エラーの代わりに書き込みと取得ができるように、2 番目の型エイリアスを書き直す方法はありますか?Type2<void>std::function<void(void)>

編集おそらく、これが必要な理由は、次のようなことを許可することであると付け加える必要があります。

Continuation<decltype(someFunc())>になりContinuation<void>、エラーが発生します。

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

c++ - ラムダのラムダ : 関数はキャプチャされません

次のプログラムはコンパイルされません:

なぜなら :

それは何を意味し、どのように問題を解決するのですか?

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

c++ - 関数ポインタが有効なのに、std :: functionが有効なテンプレートパラメータではないのはなぜですか?

CallBackAtInit初期化時に関数を呼び出すことだけを目的とした名前のクラステンプレートを定義しました(コンストラクター)。関数はテンプレートパラメータで指定されます。std::function問題は、テンプレートがパラメータとして受け入れられないことです。ただし、関数ポインタを受け入れます。なんで?

これが私のコードです:

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

c++ - std::functionテンプレートの引数の解決

私は現在、関数オブジェクトをチェーンしているライブラリに取り組んでいます。

呼び出し可能なオブジェクト(現時点ではstd :: function)を受け取り、関数の出力タイプと入力タイプでパラメーター化された関数テンプレートを作成しています。これが私が定義しているものの単純化されたバージョンです:

私が抱えている問題は使用法です。ラムダを渡すと、コンパイラーが型を正しく推測できないようです。そのため、関数が存在しないと文句を言います。

ラムダを明示的にラップするstd::functionと、プログラムは次のようにコンパイルされます。

関数ポインターまたは関数オブジェクトの受け渡しはまだテストしていませんが、明示的なオブジェクトを直接渡さない場合、コンパイラーがパラメーターInとパラメーターを推測するのは難しいようです。Outstd::function

私の質問はこれです:これを回避する方法はありますか?それにより、呼び出しサイトで明示的に言及することなく、呼び出し可能なオブジェクトの入力/戻りタイプを推測できますか?

おそらく、入力/戻り型ではなく関数型でテンプレートをパラメーター化しますか?基本的に、任意の呼び出し可能オブジェクトのInとタイプを推測する必要があります。おそらく、テンプレート関数の戻り型のOutある種のauto/トリックですか?decltype

ありがとうございました。

0 投票する
3 に答える
160 参照

c++ - 関数ラッパーの初期化はC++11でどのように機能しますか?

私がこのクラスを持っているなら

keyPressHandlerが設定されているかどうかはどうすればわかりますか?NULLに初期化してから、それに対してテストできますか?

0 投票する
6 に答える
7856 参照

c++ - std :: threadを使用するための並列?

私はstd::threadを初めて使用し、をコーディングしようとしますparallel_for。私は次のことをコーディングしました:

しかし、これは機能していません:( g ++ 4.6からのエラーコード)

この問題を解決する方法は?

編集:この新しいバージョンはコンパイルされますが、良い結果は得られません:

結果は次のとおりです。

パラレルバージョンは4950を返しますが、シーケンシャルバージョンは155を返します.....問題はどこにありますか?

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

c++ - std :: bindでこれを行う方法は?

注: タグからすでに明らかなように、これは厳密に C ++ 03です。 はい、私は知っています、ラムダはこのすべての苦痛を取り除きます(そして新しい種類をもたらすでしょう)が、これは組み込みシステムです、 90年代のOSバージョンで、C ++ 03コンパイラ(GCC4.1.x、BTW)、またはC++コンパイラを持っていてよかったと言われています。C++11の投稿は控えてください。解決策。実際にこする必要はありません。
また、もちろん、なども実際には含まstd::bind()れていますが、コードにノイズを追加するだけだと思ったので、プレフィックスを編集しました std::function()std::tr1tr1
。 )

関数を登録する必要があるサーバーのようなものがいくつかあり、オブジェクトの類似しているがわずかに異なる関数を呼び出すようにそれらを適応させる必要があります。これらの関数には異なる引数リストがあります。std::functionサーバーはそれを「認識」しており、関数を登録しようとすると、テンプレート引数として渡されたマジックタグに応じて、正しい署名(つまり、必要に応じて正しい)を持つ関数のみを受け入れます。

コードのスケッチは次のとおりです

これは実際には機能しますが、実際にはもっと多くの機能があり、退屈なコピーアンドペーストの努力としてこれを行うと、私の尊厳感が損なわれ、臭いコードが生成されます。これらの関数はすべてまったく同じように機能しますが、唯一の違いは、呼び出す関数と、渡す引数または渡さない引数だけです。これらを1つのパラメーター化された関数に折りたたんで、違いを隠しておくことができますstd::bind()。これに失敗したので、私は最初に(のように)パラメーターなしですべての関数に対してこれを行うことに決めましたfoo()。これは圧倒的多数です。

foo()そのため、 -like関数のすべての呼び出しを、面倒な部分をX実行する単一の関数を介してルーティングしたいと思いました。Y::call_it

X適切な関数を引数としてバインドします。

明らかに、これは間違っており、これを解決するための他のすべての試みも間違っています。(私は今10週間しか遊んでいstd::bind()ないので、我慢してください)。std::function結局、私は、成長した男を涙で倒すことができ、少なくとも1年間は縮小と彼の拡大家族を養うはずの、テンプレート化された内臓からの陽気なエラーメッセージの信じられないほどの迷路に迷いました。

それで、私が完全な欲求不満から自分自身を殺し、私の子供たちを孤児にする前に、どうすればこれを行うことができますか?

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

c++ - std::functionをパラメータとして渡すときに問題が発生します

私はclang3.1(gccは正常に動作します)でこの奇妙な問題を抱えています(ここでコードを簡略化しました)。std :: function(値で渡される)の不適切な使用またはclangのバグですか?

Max OSXLionでAppleclang4.1(llvm 3.1)を使用しています。

2番目のパラメーターのタイプを別のパラメーター(intなど)に変更すると、すべてが正常に機能します。

'make'ファクトリを使用する代わりに、ctorから直接Aオブジェクトを作成すると、すべてが正常に機能します。

それがclangのバグなのか、私の誤解なのか、本当に理解できません。

0 投票する
3 に答える
2536 参照

c++ - std::function を含むマップおよび std::function

std::function<T()>文字列キーをまたはのいずれかにマップする単一のマップが必要std::function<T(int)>です(ただし、特定のキーの両方ではありません)。のテンプレートがないように見えるというコンパイル エラーが発生しますstd::function<T(...)>。ラムダを値として使用できるようにしたいと思います。

まず、この方法で関数を保存しても安全ですか? 第二に、もしそうなら、構文は何ですか? (関数が単項か無項かは、マップから取得したときにわかります。) 上記のいずれでもない場合、合理的な代替手段は何でしょうか? ポインターはラムダのアイデアを殺しますよね…

C++11 は問題ありません。

0 投票する
3 に答える
14171 参照

c++ - 生の関数ポインタと void* this と比較した std::function のパフォーマンス?

ライブラリ コード:

アプリケーション コード:

上記は、コールバック メカニズムの最小限の実装です。これはより冗長であり、std::function のようにバインディングやプレースホルダーなどをサポートしていません。std::function上記のユースケースにorを使用するboost::functionと、パフォーマンス上の欠点はありますか? このコールバックは、リアルタイム アプリケーションの非常に重要なパスになります。boost::function は仮想関数を使用して実際のディスパッチを行うと聞きました。バインディング/プレースホルダーが含まれていない場合、最適化されますか?

アップデート

最新のコンパイラでアセンブリを検査することに関心がある場合: https://gcc.godbolt.org/z/-6mQvt