Exercise 01 学習ノート 🧠

iterとテンプレートの応用

1. `const` と 非`const` の両方をサポートする仕組み

`iter`関数が`const`配列(読み取り専用)と非`const`配列(変更可能)の両方に対応できるのは、「関数のオーバーロード」というC++の強力な機能のおかげです。引数の`const`の有無によって、コンパイラが最適なバージョンの関数を自動で選択し、安全性を保証します。

インタラクティブ・デモ:`iter`の動作を試す

以下のドロップダウンで配列の型と適用する関数を選び、「コンパイル実行」ボタンを押して結果を確認してみましょう。

ここにシミュレーション結果が表示されます。

2. インスタンス化された関数テンプレートを引数にする

`iter`の第3引数に関数テンプレートを渡す時、内部では2つの重要なステップが起こっています。これにより、汎用的な操作を別の汎用的な処理に組み合わせることができ、コードの再利用性が飛躍的に向上します。

プロセス分解:`iter(array, 5, printElement);`

iter(array, 5, printElement<int>);

ステップ①:インスタンス化(実体化)

`printElement`と型を指定した瞬間、コンパイラは`printElement`という「設計図」から`int`専用の具体的な関数(インスタンス)を生成します。

ステップ②:関数ポインタとして渡す

ステップ①で生成された関数のメモリアドレスが、`iter`関数の第3引数として渡されます。`iter`はそのアドレスを使って、ループ内で関数を呼び出します。