構造化束縛: C++17の分解代入
pair/tuple/構造体を一度に分解。可読性向上。
構造化束縛
C++17。複合型を分解して変数へ。
分解
pair/tuple/配列を個別変数に。
if 初期化
if 文内で変数宣言。
構造化束縛
多値返却(関数から複数の値を返す)が非常に楽になります。`std::tie` のような事前の変数宣言も不要で、`auto [x, y] = ...` と書くだけで型推論も効きます。map のループ処理では特に威力を発揮します。
// 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 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 と構造化束縛でループしてください。