構造化束縛: C++17の分解代入

pair/tuple/構造体を一度に分解。可読性向上。

構造化束縛
C++17。複合型を分解して変数へ。
分解
pair/tuple/配列を個別変数に。
if 初期化
if 文内で変数宣言。

構造化束縛

荷解き (Unpacking Package)

関数の戻り値やタプルは「詰め合わせセット」です。以前は箱から一つずつ取り出して名前をつける(`get<0>`, `get<1>`)必要がありました。構造化束縛は、箱をひっくり返して中身をぶちまけ、一瞬で名札をつけるようなものです。

多値返却(関数から複数の値を返す)が非常に楽になります。`std::tie` のような事前の変数宣言も不要で、`auto [x, y] = ...` と書くだけで型推論も効きます。map のループ処理では特に威力を発揮します。

Structured Bindings
// C++17 構造化束縛
std::pair<int, std::string> p{42, "hello"};
auto [num, str] = p; // 分割代入
// タプル
std::tuple<int, double, std::string> t{1, 3.14, "pi"};
auto [a, b, c] = t;
// 配列
int arr[] = {10, 20, 30};
auto [x, y, z] = arr;
// マップのイテレーション
std::map<std::string, int> m{{"a", 1}, {"b", 2}};
for (const auto& [key, value] : m) {
std::cout << key << ": " << value << "
";
}
実行結果
auto [num, str] = pair → num=42, str="hello"\nauto [x,y,z] = arr → 10, 20, 30
Bad
// ❌ Bad: std::get で個別アクセス
auto pair = getPair();
int first = std::get<0>(pair);
int second = std::get<1>(pair);
Good
// ✅ Good: 構造化束縛
auto [first, second] = getPair();

パターン

struct, if-init
// 構造体/クラスにも使える
struct Point { int x, y; };
Point p{10, 20};
auto [px, py] = p;
// if 文と組み合わせ
if (auto [iter, inserted] = mySet.insert(42); inserted) {
std::cout << "Inserted!
";
}
// const/& の修飾
const auto& [x, y] = getPoint(); // const 参照
auto& [rx, ry] = point; // 変更可能な参照
Tip: map のループでは [key, value] で読みやすく。

合格ライン

pair/tuple を分解できる
map のループで使える

参考リンク

演習課題

課題1: 構造化束縛
std::pair を構造化束縛で分解してください。
課題2: map と構造化束縛
std::map を range-for と構造化束縛でループしてください。

次のステップ