yohhoyの日記

技術的メモをしていきたい日記

多値返却×型推論 in C++ (2)

C++1z(C++17)で導入予定の Structured Bindings と クラステンプレートの型推論 を組み合わせて、多値返却関数からの戻り値を型推論された個別変数にて受け取る方法。こちらは多値返却関数fooの戻り値を型推論する前提。

// C++1z(C++17)
#include <cassert>
#include <string>
#include <tuple>
#include <type_traits>
using namespace std::string_literals;  // operator ""s

auto func()
{
  // コンストラクタ実引数から要素型推論&構築
  return std::tuple( 42, "Hello"s, 3.14 );
}

int main()
{
  // Structured Bindingsによる個別型推論
  auto [i, s, d] = func();

  assert(i == 42 && s == "Hello"s && d == 3.14);
  static_assert(std::is_same_v<decltype(i), int>);
  static_assert(std::is_same_v<decltype(s), std::string>);
  static_assert(std::is_same_v<decltype(d), double>);
}

C++14時点では std::tuple<Ts...> コンストラクタ実引数からクラステンプレートパラメータ型Ts...は推論されない。代わりに std::make_tuple<Ts...> 関数テンプレートの実引数から型推論させる。この例では make_ の5文字分短縮できるだけだが…

// C++14
auto func()
{
  return std::make_tuple(42, "Hello"s, 3.14);
}

関連URL