C++のテンプレートとは、「型に依存しない」プログラムを作るための仕組みです。
同じ処理をint型、double型、string型などで繰り返し書く必要がなくなります。
まずは、型ごとに異なる関数を作る代わりに、テンプレートを使う例を見てみましょう。
// 21_template_basic.cpp
#include <iostream>
#include <string>
using namespace std;
// 型に依存しないテンプレート関数
template <typename T>
void showValue(T value) {
cout << "値: " << value << endl;
}
int main() {
showValue(10); // int型
showValue(3.14); // double型
showValue('A'); // char型
showValue(string("Hi")); // string型
return 0;
}template <typename T>では、T
は「型の変数」であり、呼び出すときの実際の型に応じて自動的に置き換わります。
showValue(10);ではTはint型として動作します。
showValue(3.14);ではTはdouble型として動作します。
他も同様にchar型、string型として呼び出しに合わせて型が変わります。
出力結果(例)
値: 10
値: 3.14
値: A
値: Hi
関数だけでなく、クラスにもテンプレートを使うことができます。
「型を入れ替えられるクラス」を作ることで、汎用的なデータ構造を実現できます。
// 21_template_class.cpp
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Box {
private:
T value; // 保持する値
public:
// コンストラクタ:初期値を受け取る
Box(T initialValue) : value(initialValue) {}
void show() {
cout << "Boxの中身: " << value << endl;
}
};
int main() {
Box<int> intBox(123); // int型のBox
Box<double> dblBox(4.56); // double型のBox
Box<char> charBox('X'); // char型のBox
Box<string> strBox("Hello"); // string型のBox
intBox.show();
dblBox.show();
charBox.show();
strBox.show();
return 0;
}template <typename T>では、T
は「型の変数」です。
Box<int> intBox(123);ではTはint型として動作します。
Box<double> dblBox(4.56);ではTはdouble型として動作します。
他も同様にchar型、string型として呼び出しに合わせて型が変わります。
出力結果(例)
Boxの中身: 123
Boxの中身: 4.56
Boxの中身: X
Boxの中身: Hello
| メリット | 内容 |
|---|---|
| 再利用性 | 型ごとに同じ処理を繰り返し書かなくてよい |
| 保守性 | コードを1か所修正すれば全型に反映される |
| 可読性 | 「何をしているクラス・関数か」が明確になる |
template <typename T>
で型に依存しないコードを書ける。テンプレートは、ゲーム開発でも便利です。例えば「スコア」「HP」「MP」など、さまざまな型の値を管理する共通クラスを作れます。
// 21_game_status_template.cpp
#include <iostream>
using namespace std;
template <typename T>
class Status {
private:
T value;
public:
Status(T v) : value(v) {}
void set(T v) { value = v; }
T get() { return value; }
};
int main() {
Status<int> hp(100); // HP(整数)
Status<double> mp(35.5); // MP(小数)
cout << "HP: " << hp.get() << endl;
cout << "MP: " << mp.get() << endl;
return 0;
}実行結果(例)
HP: 100
MP: 35.5
次のコードの出力を答えなさい。
#include <iostream>
using namespace std;
template <typename T>
T multiply(T a, T b) {
return a * b;
}
int main() {
cout << multiply<int>(2, 3) << endl;
cout << multiply<double>(1.5, 2.0) << endl;
return 0;
}6
3
maxValue(T a, T b)
を作成し、大きい方の値を返すようにせよ。int と double
で試し、正しい値が返ることを確認せよ。// 21_template_practice.cpp
#include <iostream>
using namespace std;
template <typename T>
T maxValue(T a, T b) {
return (a > b) ? a : b;
}
int main() {
cout << maxValue<int>(10, 20) << endl; // 20
cout << maxValue<double>(2.5, 1.8) << endl; // 2.5
return 0;
}