このブログ記事では、C++におけるテンプレートを紹介します。

関数テンプレート
CとC++はどちらもコンパイル言語であるため、すべての関数に対して入力と出力の型を指定する必要があります。 しかし、これは以下のように重複を生むことがあります。
int sum (int a, int b) {
return a + b;
};
double sum (double a, double b) {
return a + b;
};
両方の関数のロジックは同一ですが、これまでは別々に定義しなければなりませんでした。しかし、C++では、関数テンプレートを使用して型変数を作成し、1つの関数定義でこれを実現できます。
template <typename T>
T sum (T a, T b) {
return a + b;
};
int main () {
cout << sum<int>(3, 4) << endl;
cout << sum(3.1, 4.4) << endl; // compiler can infer the type
return 0;
}
コンパイラが使用する型を認識し、自動的にテンプレート関数を生成してくれます。これにより、重複が減り、 リファクタリングが容易になります。
クラステンプレート
また、クラステンプレートを作成することも可能で、以下のように柔軟なクラスを定義できます。
template <typename T>
class Array {
public:
T array[10];
void fill (T value) {
for (int i; i < 10; i++) {
array[i] = value;
}
};
};
これにより、文字列、整数、浮動小数点数などの配列を作成することができます。 さらに、複数の型変数やテンプレート変数をテンプレートで定義することも可能です。
template <typename T, int length>
class Array {
public:
T array[length];
void fill (T value) {
for (int i; i < length; i++) {
array[i] = value;
}
};
};
int main () {
Array<int, 8> arr;
return 0;
}
コンパイラは、クラステンプレートから指定された型やテンプレート変数の値に基づいてテンプレートクラスを生成します。
注意点
テンプレートは非常に柔軟で重複を減らすことができますが、初心者がよく犯すミスもあります。 まず、テンプレート関数やクラスは実行時ではなく、コンパイル時に生成されることを忘れてはいけません。 つまり、以下のようなコードはコンパイルできません。
int main () {
int x;
cin >> x;
Array<int, x> arr; // Err!
return 0;
}
cin
は実行時にコンソールから入力を取得するため、上記のコードはコンパイルに失敗します。もう一つの一般的なミスは、
関数テンプレートを使った関数のオーバーロードで発生します。
template <typename T>
T sum (T a, T b) {
return a + b;
};
T sum (T a, T b, T c) {
return a + b + c;
};
int sum (int a, int b) {
return a + b;
};
上記の関数オーバーロードは問題ありません。なぜなら、あいまいさがないからです。3つの引数が提供された場合は2つ目の関数が使用され、2つの整数が提供された場合は最後の関数が呼び出され、2つの非整数が提供された場合は最初のテンプレート関数が使用されます。しかし、次の例ではあいまいさが生じます。
template <typename T>
T sum (T a, int b) {
return a + b;
};
T sum (int a, T b) {
return a + b;
};
1つの入力が整数である場合、もう1つの入力と出力も整数でなければならないため、コンパイラはどちらのテンプレートを選択するかを決定できず、あいまいさが発生します。関数テンプレートを使ったオーバーロードでは、必ずあいまいさがないか確認する必要があります。
クイズ
この記事では、学習した内容を確認するためのクイズを設けます。記事のメイン部分を読んだ後に、ぜひ自分で問題を解いてみることを強くお勧めします。各問題をクリックすると答えが表示されます。
リソース
- CodeAesthetic. 2023. The Flaws of Inheritance. YouTube.
- Portfolio Courses. 2022. Abstract Classes And Pure Virtual Functions | C++ Tutorial. YouTube.