C++ Academy · レッスン

構造化束縛とif-init(C++17)

構造化束縛でタプルやpairを分解し、if-init文を使います。

レッスン 4/413 ステップ

「構造化束縛とif-init(C++17)」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

モダンC++での分解

C++17では構造化束縛が追加されました。タプル、pair、配列、集約型を個別の名前付き変数に展開する、すっきりした方法です。

基本形

auto [a, b, ...]を使うと、右辺の値の各要素に束縛された変数を宣言できます。

std::pair<std::string, int> p = {"Ada", 30};
auto [name, age] = p;
std::cout << name << " is " << age;

mapの反復処理での束縛

最も分かりやすい改善例はmapの反復処理です。もうit.firstやit.secondを書く必要はありません。

std::map<std::string, int> ages = {{"Ada",30},{"Bob",24}};
for (const auto& [name, age] : ages) {
    std::cout << name << " " << age << "\n";
}

参照による束縛

auto&を使うと、参照によって束縛できます。束縛した名前を変更すると、元のオブジェクトも変更されます。

std::pair<int, int> p = {1, 2};
auto& [a, b] = p;
a = 99;
std::cout << p.first;   // 99

const束縛

コピーせずに読み取り専用で分解するには、const auto&を使います。

for (const auto& [key, value] : map) {
    // read only
}

配列とタプルの束縛

C配列やstd::tupleを含め、tuple-likeインターフェースをサポートする型であれば使用できます。

int arr[3] = {1, 2, 3};
auto [x, y, z] = arr;

std::tuple<int, std::string, double> t = {1, "hi", 3.14};
auto [a, s, d] = t;

通常の構造体の束縛

メンバーがpublicである構造体なら、どれでも分解できます。名前は宣言順に基づいて推論されます。

struct Point { int x; int y; };
Point pt{3, 4};
auto [x, y] = pt;
std::cout << x << ", " << y;

if-init文

C++17では、ifとswitchに初期化文も追加されました。ヘッダー内で一時変数を宣言すると、そのスコープはifまたはswitchの本体になります。

if (auto it = map.find("Ada"); it != map.end()) {
    std::cout << it->second;
} else {
    std::cout << "not found";
}

2つの機能の組み合わせ

構造化束縛とif-initは組み合わせて、洗練されたコードを書くことができます。

if (auto [it, inserted] = m.insert({"key", 42}); inserted) {
    std::cout << "added";
} else {
    std::cout << "already present";
}

束縛の有効期間

束縛は、基になる無名変数のサブオブジェクトを参照します。束縛は、それを囲むスコープの終わりまで存続し、通常のローカル変数と同じ有効期間を持ちます。

束縛を使わない場合

メンバー名が持つ意味を束縛名では表せない場合は、明示的なメンバーアクセスを選んでください。簡潔さよりも読みやすさを優先します。

クイックチェック

名前付きの要素を使ってstd::mapを反復処理できるC++17の機能はどれですか。

まとめ

構造化束縛を使うと、pair、タプル、配列、構造体を名前付き変数に分解できます。C++17のif-init文と組み合わせることで、反復処理や検索のコードを大幅にすっきりさせられます。

無料で開始

AI チューターと学ぶ C++ — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「構造化束縛とif-init(C++17)」レッスンは無料ですか?

はい。「構造化束縛とif-init(C++17)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「構造化束縛とif-init(C++17)」で何を学びますか?

構造化束縛でタプルやpairを分解し、if-init文を使います。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「構造化束縛とif-init(C++17)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. auto、decltype、型推論
  2. 範囲ベースfor、nullptr、enum class
  3. ラムダ式:キャプチャ、mutable、ジェネリック
  4. 構造化束縛とif-init(C++17)
← C++ Academyに戻る