型システム編 - ジェネリクス
難易度: 🔴 上級
所要時間: 35分
ジェネリック関数
<T> T identity(T value) {
return value;
}
int main() {
const int i = identity(42); // 結果は不変
const double d = identity(3.14);
const string s = identity("Hello");
return 0;
}
型推論
<T> T max(T a, T b) {
return a > b ? a : b;
}
int main() {
const int i = max(10, 20); // 結果は不変
const double d = max(3.14, 2.71);
return 0;
}
ジェネリック構造体
struct Box<T> {
T value;
}
int main() {
Box<int> int_box;
int_box.value = 42;
Box<string> str_box;
str_box.value = "Hello";
return 0;
}
複数の型パラメータ
struct Pair<T, U> {
T first;
U second;
}
<T, U> Pair<T, U> make_pair(T first, U second) {
Pair<T, U> p;
p.first = first;
p.second = second;
return p;
}
int main() {
const Pair<int, string> p = make_pair(1, "one"); // 結果は不変
return 0;
}
ジェネリックコレクションのRAII
ジェネリックコレクション(Vector<T>など)は、self()コンストラクタと~self()デストラクタを持ちます。
import std::collections::vector::*;
struct TrackedObject {
int id;
}
impl TrackedObject {
~self() {
println("~TrackedObject({self.id})");
}
}
int main() {
{
Vector<TrackedObject> objects(); // コンストラクタ呼び出し
objects.push(TrackedObject { id: 100 });
objects.push(TrackedObject { id: 200 });
// スコープ終了時:
// 1. ~Vector()が呼ばれる
// 2. 各要素の~TrackedObject()が呼ばれる
}
return 0;
}
出力:
~TrackedObject(100)
~TrackedObject(200)
最終更新: 2026-02-08