C++Builderで構造化束縛(Structured Bindings)を使用する

提供: Support
移動先: 案内検索

概要

この記事では、C++17で利用可能な構造化束縛(Structured Bindings)を使用して効率的なコードを迅速に書く方法をC++Builderで学びます。


C++17では、糖衣構文(syntax sugar)と自動型推論を統合する新機能として「構造化束縛」が導入されました。構造化束縛は、ペア、タプル、構造体や配列などを要素に分解する機能で、これを利用すると関数から複数の値を返した場合、戻り値の受け取りが簡単になります。


構造化束縛の構文は、以下の通りです。

auto [var1, var2, ...] = <pair, tuple, struct, or array expression>;
  • 変数 var1, var2 – のリストは、代入される式に含まれる変数の数と正確に一致しなければなりません。
  • 次に以下のいずれかが必要
    • std::pair
    • std::tuple
    • 構造体
    • 配列
  • 型として “auto”,”const auto”, “auto&&”といった自動推論型が使用可能(auto以外の型、例えば、intやdoubleといった具体的な型は使用不可)


角括弧[…]で囲まれた変数の数が一致しない場合、以下のコード例のようにコンパイラはエラーを発生し、構文の間違いを指摘します。

std::tuple<float, int, long> tup {3.55, 1, 99};
auto [a, b] = tup; // gives an error

実際のコード例を見てみましょう

#ifdef _WIN32
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#endif
 
#include <string>
#include <iostream>
#include <tuple>
 
// Demonstrate structured bindings - here, a method might in the past
// have had a bool success result, and an error param written to.
// Now, can return both (all error info) as one tuple, bound automatically
// to local vars through the auto keyword (much nicer than std::tie
// in C++11/14)
 
auto connect_to_network() {
  // The connection could succeed, or fail with an error message
  // Here, mimic it failing
  bool connected{ false }; // failed!
 
  std::string str_error{ "404: resource not found" };
 
  return std::make_tuple(connected, str_error);
}
 
int _tmain(int argc, _TCHAR* argv[]) {
  auto [connected, str_error] = connect_to_network();
 
  if (!connected) {
    std::cout << str_error;
  }
 
  system("pause");
 
  return 0;
}

上記のコードのように構造化束縛を使用することで、より効率的で整頓されたコードを記述できます。


「構造化束縛」について詳しく知りたい方は、公式ドキュメントを参考ください。また、この記事で紹介しましたサンプルコードは、こちらからダウンロードできます。