C++ では、関数へのポインターを作成できます。「関数へのポインター」を引数として別の関数に渡すことができるようにします。設計パターンについて考えるとき、「関数へのポインタ」を使用する利点を特別に利用する特定の設計パターンはありますか?
3 に答える
コールバックを利用する設計パターン。ビジター、ストラテジー、オブザーバーなど。C++ では、ファンクタも使用でき、一般に STL で優先されることに注意してください。
関数へのポインターで達成できることのほとんどは、より最適化されたファンクターや、より優れた OO 設計のための仮想メソッドを使用して達成できます。ただし、関数へのポインターは、C コードと C++ コードが相互にインターフェイスしている狭いユース ケースの要件です。OO 設計パターンでは、C コードをパターンに参加させることができます。また、特定の C インターフェイスは関数ポインターのみを受け入れるため、これらの API を使用する C++ コードは関数ポインターを渡す必要があります。
関数ポインターは、通常、ある種のサブスクリプション/パブリッシュ モデル (イベント通知) に登録されているコードを呼び出す手段として使用されます。たとえば、状態パターンhandle()
のメソッドに使用できます。
ただし、特定のフレームワーク内でコードを実行するための単純なフックとして使用することもできます。たとえばpthread_create
、スレッドの起動後に呼び出される関数ポインターを受け取ります。
これは通常、関数の特定の部分を特定のケースに合わせてカスタマイズする必要がある場合に行われます。同じ関数を複数回使用できるようにすることで、これは C++ の for_each 関数で実証されています。これは iterable を通過し、それに関数を適用します。実際には、より再利用可能なコードが可能になります。
関連して、C++ 標準ライブラリは、そのコンテナ クラスに同様のセットアップを使用します。
例えば:
template < class T, class Container = deque<T> > class stack;
スタック クラスの宣言です。ご覧のとおり、基になるデータ構造の構成可能なパラメーターを受け取ります。これは、関数ポインターの使用方法に似ています。
編集:または他のポスターからの言及されたコールバック。