C++のテンプレート(Template)とは?型に依存しない汎用的な関数・クラスを作ろう!
C++のテンプレート(Template)は、型に依存しない汎用的なプログラムを記述するための機能です。
関数やクラスの処理をひとつのテンプレートとして定義しておけば、int型でもdouble型でもstring型でも再利用が可能になります。
この記事では、C++のテンプレートの基本から使い方、応用までを初心者にもわかりやすく解説します。
テンプレートとは?
テンプレートとは、関数やクラスの「型」を引数として受け取る仕組みです。
つまり、データ型に依存しない共通処理をひとつの定義で使い回せるようになります。
関数テンプレートの基本構文
template <typename T>
戻り値 関数名(引数の型) {
// 処理
}
typename
(またはclass
)は、テンプレート引数を示すキーワードです。
関数テンプレートの例
#include <iostream>
using namespace std;
template <typename T>
T maxValue(T a, T b) {
return (a > b) ? a : b;
}
int main() {
cout << maxValue(3, 7) << endl; // int型
cout << maxValue(3.5, 2.1) << endl; // double型
cout << maxValue('a', 'z') << endl; // char型
return 0;
}
この関数は、どの型でも最大値を求められる汎用関数です。
呼び出し時に自動的に型が推論され、適切な処理が選ばれます。
クラステンプレートの基本構文
template <typename T>
class クラス名 {
private:
T data;
public:
クラス名(T value) {
data = value;
}
void show() {
cout << data << endl;
}
};
クラステンプレートの例
#include <iostream>
using namespace std;
template <typename T>
class Box {
private:
T value;
public:
Box(T v) : value(v) {}
void display() {
cout << "中身: " << value << endl;
}
};
int main() {
Box<int> intBox(123);
Box<string> strBox("こんにちは");
intBox.display(); // 中身: 123
strBox.display(); // 中身: こんにちは
return 0;
}
テンプレートのメリット
- 汎用性のあるコードが書ける
型を変えても同じロジックを再利用可能。
- 冗長なコードを減らせる
同じ処理を何度も書かなくてよい。
- コンパイル時に展開されるため高速
テンプレートはマクロとは異なり、型安全です。
注意点
- テンプレートはエラーメッセージが長くなることがあります。
- 複雑なテンプレートは可読性が下がるので注意が必要です。
- 定義と実装はヘッダファイルにまとめるのが一般的です(コンパイルの都合上)。
まとめ
C++のテンプレートは、型に依存しない柔軟で再利用性の高いコードを記述するための強力な機能です。
特に、STL(標準テンプレートライブラリ)もテンプレートで構成されており、C++の中核ともいえる概念です。
まずは簡単な関数テンプレートから始めて、徐々にクラステンプレートやSTLの活用へと発展させていきましょう!