1. `const` と 非`const` の両方をサポートする仕組み
`iter`関数が`const`配列(読み取り専用)と非`const`配列(変更可能)の両方に対応できるのは、「関数のオーバーロード」というC++の強力な機能のおかげです。引数の`const`の有無によって、コンパイラが最適なバージョンの関数を自動で選択し、安全性を保証します。
インタラクティブ・デモ:`iter`の動作を試す
以下のドロップダウンで配列の型と適用する関数を選び、「コンパイル実行」ボタンを押して結果を確認してみましょう。
ここにシミュレーション結果が表示されます。
2. インスタンス化された関数テンプレートを引数にする
`iter`の第3引数に関数テンプレートを渡す時、内部では2つの重要なステップが起こっています。これにより、汎用的な操作を別の汎用的な処理に組み合わせることができ、コードの再利用性が飛躍的に向上します。
プロセス分解:`iter(array, 5, printElement);`
iter(array, 5, printElement<int>);
ステップ①:インスタンス化(実体化)
`printElement
ステップ②:関数ポインタとして渡す
ステップ①で生成された関数のメモリアドレスが、`iter`関数の第3引数として渡されます。`iter`はそのアドレスを使って、ループ内で関数を呼び出します。