C++を使っていく上で欠かせない技術の1つにテンプレートという技術があります。
今回はそんなテンプレートの基本について書いていきます。
まず軽くメリットとデメリットについて考えてみました。
メリット
マクロでは危険性のある処理も安全に実装できる
マクロは定義されているものをそのまま置き換えているだけなので危険な記述になることがあります。
しかしテンプレートを使用した場合は関数として処理されるのでマクロの危険性を回避することが出来ます。
汎用性のある実装をすることができる
実装の段階で型が固定されないので特定の型に依存しない処理が記述できる。
応用性が高く普通には出来ないことが沢山できる
特殊化などの機能により多くの応用方法が存在します。
標準に組み込まれているテンプレートライブラリ(STL)も様々な応用を使って実装されています。
デメリット
コンパイルエラーの内容が分かり難い
テンプレートには記述に色々と決まりごとがあります。
そして決まりごとを破るとエラーが出るのですが、慣れるまではエラー内容を見ただけで何故エラーなのか分かり難い箇所が多々あります。
また実装の段階ではエラーが表示されず、利用する際に初めてエラーが発生するパターンがあります
※コンパイラによってエラーの出るタイミングが異なります。
コードが肥大化する
テンプレートは記述処理が1つだけだったとしても複数の挙動を実装することが出来ます。
しかし実際には使用している条件の数だけコードが生成されているのです。
その為、処理によっては膨大なコードが生成される可能性があります。
このようにメリットとデメリットが存在しますが
下手に使わない限りはデメリットがメリットを上回ることは無いと思います。
なのでテンプレート技術の取得はC++でのプログラミングには必須といっても過言ではないでしょう。
基本的な関数テンプレートの使い方
では基本的な使い方について描いていきます。
template<typename T> T Max(T a, T b) { return a < b? b: a; } printf("%d %.1f", Max(5, 10), Max(5.0f, 10.0f)); 結果:10 10.0
このようにテンプレートは特定の型に依存しない処理を記述することが出来ます。
今回は引数から型が特定出来る形になっているので普通に呼び出すだけで実行することが可能です。
ですが引数の型がバラバラの場合や呼び出したい形が異なる場合は型を指定する必要があります。
Max<int>(5, 10.0f); Max<float>(5, 10);
このように関数の呼び出し時に型を記述することで挙動を決定します。
もし引数の型がバラバラの状態で呼び出し時に型を指定しなかった場合はエラーになります。
次回は特殊化などについてを記載していきます。
まだテンプレートを使ったことない人は見に来てくださいね!