やむを得ない理由がない限り、std::function を使用する
C でコールバック関数を使用する場合、 C スタイルの関数ポインターと新しい std::function については議論の余地があるかもしれません。各オプションの長所と短所を調べてみましょう。
C スタイルの関数ポインタ:
std::function:
std::function を使用する場合:
ほとんどの場合、std::function が推奨されます。関数ポインターよりも柔軟性があり、将来性もあります。特定のパフォーマンス上の懸念がない限り、通常はコールバックの受け渡しに std::function を使用することをお勧めします。
関数ポインターを使用する場合:
パフォーマンスが重要な場合コールバック関数がコンテキスト変数をキャプチャする必要がない場合は、関数ポインターの方が良い選択肢になる可能性があります。ただし、このシナリオは比較的まれです。
3 番目のオプション: テンプレート パラメーター
コールバック関数を呼び出し可能なオブジェクトにする場合は、テンプレート パラメーターの使用を検討してください。このアプローチは柔軟性を提供しますが、ヘッダーに外部関数を実装する必要があります。
概要表:
Feature | Function Pointer | std::function | Template Parameter |
---|---|---|---|
Can capture context | No | Yes | Yes |
Call overhead | None | Small | None |
Can be inlined | No | No | Yes |
Can be stored in class member | Yes | Yes | No |
Implemented outside of header | Yes | Yes | No |
Supported without C 11 standard | Yes | No | Yes |
Readability | Poor | Good | Fair |
結論:
一般に、std::function の利点は関数ポインターの利点を上回ります。より柔軟で、将来性があり、読みやすいです。特定のパフォーマンス上の懸念がある場合、またはコールバック関数がコンテキスト変数をキャプチャする必要がない場合にのみ、関数ポインターを使用してください。
以上がstd::function と関数ポインター: いつ何を選択する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。