MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C++の基礎 - 構造化束縛のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C++の基礎 - 構造化束縛
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == 構造化束縛は、C++17で導入された機能であり、複数の変数を同時に初期化することができる便利な構文である。<br> 構造化束縛は、コードの可読性を向上させて、複数の値を扱う場合のボイラープレートコード (冗長さ) が軽減される。<br> <br> 基本的な使用方法としては、配列、タプル、構造体等から複数の値を1度で取得して、個別の変数に割り当てることができる。 例えば、関数が複数の値を返す場合において、以前は各値を個別に取得する必要があったが、構造化束縛を使用することにより1行で簡潔に記述できる。<br> <br> この機能は配列に対しても適用可能である。<br> 特に、固定長の配列から値を取得する場合に便利であり、各要素を個別の変数として扱うことができる。<br> <br> また、publicメンバを持つ構造体に対して構造化束縛を適用することにより、メンバ変数を直接個別の変数として扱うこともできる。<br> これにより、構造体のメンバにアクセスする場合の記述が簡略化される。<br> <br> さらに、参照による束縛も可能であり、値のコピーではなく元のデータへの参照を保持できる。<br> この特性は、大きなオブジェクトを扱う場合やパフォーマンスが重要な場面で特に有効である。<br> <br> const修飾子との組み合わせも重要な特徴である。<br> 構造化束縛で取得した変数を変更不可能にすることができるため、意図しない変更を防ぐのに役立つ。<br> <br> ラムダ式との組み合わせも強力である。<br> 例えば、<code>std::pair</code>クラスの要素を持つコンテナをイテレートする場合に、各要素のペアを直接分解して扱うことができる。<br> これにより、コードがより直感的で可読性が上がる。<br> <br> 構造化束縛は、複数の戻り値を持つ関数、タプルや構造体の要素への簡易アクセス、イテレーションの簡素化等、様々な場面で活用できる。<br> この機能を適切に使用することにより、C++のコードをより簡潔かつ表現力豊かにすることができる。<br> <br> ただし、過度に複雑な構造に対して使用するとコードの理解が難しくなる可能性もあるため、適切な使用が求められる。<br> <br> 特に、関数から複数の値を返す場合やコンテナの要素をイテレートする場合に便利である。<br> <br><br> == 構造化束縛の基本 == 配列、タプル、構造体等から複数の値を1度に取得して、個別の変数に割り当てることができる。<br> <br> <syntaxhighlight lang="c++"> std::tuple<int, std::string, double> getData() { return {1, "Hello", 3.14}; } // 使用例 auto [id, name, value] = getData(); </syntaxhighlight> <br><br> == 配列との使用 == 固定長の配列に対して使用することができる。<br> <br> <syntaxhighlight lang="c++"> int arr[] = {1, 2, 3}; auto [a, b, c] = arr; </syntaxhighlight> <br><br> == 構造体との使用 == publicメンバを持つ構造体に対して適用することができる。<br> <br> <syntaxhighlight lang="c++"> struct Point { int x; int y; }; // 使用例 Point p{10, 20}; auto [x, y] = p; </syntaxhighlight> <br><br> == 参照による束縛 == 値のコピーではなく、参照として変数を束縛することもできる。<br> <br> <syntaxhighlight lang="c++"> auto& [ref_x, ref_y] = p; ref_x = 100; // pのxも変更される </syntaxhighlight> <br><br> == constとの組み合わせ == <code>const</code>修飾子を使用して、変更不可能な変数として束縛することもできる。<br> <br> <syntaxhighlight lang="c++"> const auto [const_x, const_y] = p; // const_x = 100; // エラー: constなので変更不可 </syntaxhighlight> <br><br> == ラムダ式での使用 == ラムダ式の引数としても構造化束縛を使用することができる。<br> <br> <syntaxhighlight lang="c++"> std::vector<std::pair<int, std::string>> vec = {{1, "one"}, {2, "two"}}; std::for_each(vec.begin(), vec.end(), [](const auto& [num, str]) { std::cout << num << ": " << str << std::endl; }); </syntaxhighlight> <br><br> == マップのイテレーション == 以下の例では、マップの各要素のキーと値を直接変数に束縛している。<br> <br> <syntaxhighlight lang="c++"> std::map<std::string, int> scores = {{"Alice", 95}, {"Bob", 87}, {"Charlie", 92}}; for (const auto& [name, score] : scores) { std::cout << name << " scored " << score << " points." << std::endl; } </syntaxhighlight> <br> == 関数から複数の値を返す場合 == 以下の例では、複数の戻り値を持つ関数の結果を簡単に取得できる。<br> これにより、戻り値の各要素に個別にアクセスする必要がなくなり、コードが簡潔になる。<br> <br> <syntaxhighlight lang="c++"> std::tuple<bool, std::string, int> processInput(const std::string &input) { // 入力処理のロジック bool success = true; std::string message = "処理成功"; int result = 42; return {success, message, result}; } // 関数の呼び出しと結果の取得 auto [success, message, result] = processInput("some input"); if (success) { std::cout << "処理結果: " << result << ", メッセージ: " << message << std::endl; } else { std::cout << "エラー: " << message << std::endl; } </syntaxhighlight> <br> == 構造体との組み合わせ == 以下の例では、構造体の各メンバを直接変数に束縛している。<br> これにより、構造体のフィールドにアクセスする際の記述が簡略化される。<br> <br> <syntaxhighlight lang="c++"> struct NetworkStats { int packetsReceived; int packetsSent; double latency; }; NetworkStats getNetworkStats() { // ネットワーク統計取得のロジック return {1000, 950, 0.05}; } auto [received, sent, latency] = getNetworkStats(); std::cout << "受信パケット: " << received << ", 送信パケット: " << sent << ", レイテンシ: " << latency << "秒" << std::endl; </syntaxhighlight> <br> == エラーハンドリング == 以下の例では、if文の初期化部分で構造化束縛を使用している。<br> これにより、関数の戻り値を直接条件式で使用でき、コードの流れがより自然になる。<br> <br> <syntaxhighlight lang="c++"> std::pair<bool, std::string> validateUser(const std::string &username, const std::string &password) { // ユーザ検証ロジック if (username == "admin" && password == "secret") { return {true, "認証成功"}; } return {false, "ユーザー名またはパスワードが無効です"}; } if (auto [isValid, message] = validateUser("admin", "wrong_password"); isValid) { std::cout << "ログイン成功: " << message << std::endl; } else { std::cout << "ログイン失敗: " << message << std::endl; } </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:C++]]
C++の基礎 - 構造化束縛
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse