構造化束縛とif-init(C++17)
構造化束縛でタプルやpairを分解し、if-init文を使います。
「構造化束縛と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; // 99const束縛
コピーせずに読み取り専用で分解するには、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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- auto、decltype、型推論
- 範囲ベースfor、nullptr、enum class
- ラムダ式:キャプチャ、mutable、ジェネリック
- 構造化束縛とif-init(C++17)