最終更新日時(UTC):
が更新

履歴 編集

function template
<tuple>

std::tuple_cat(C++11)

namespace std {
  template <class... Tuples>
  tuple<Ctypes ...> tuple_cat(Tuples&&...);                // C++11

  template <class... Tuples>
  constexpr tuple<Ctypes ...> tuple_cat(Tuples&&...);      // C++14

  template <tuple-like... Tuples>
  constexpr tuple<Ctypes ...> tuple_cat(Tuples&&... tpls); // C++23
}

概要

複数のtupleを繋ぎ合わせ、1つのtupleにする。C++23 からはtuple-likeである型を対象に繋ぎ合わせることが可能。

要件

  • C++20まで :
    • Tuples...の全ての型がstd::tuple<Args...>であること。
    • Args...の各型が左辺値参照であればコピー構築可能、そうでなければムーブ構築可能であること。
  • C++23から :
    • 本関数の返り値のtupleのテンプレートパラメーターパックをCtypesとし、Ctypesの全ての要素について、引数tplsにおいて対応する要素の型から構築可能であること。
    • より厳密には、次のように定義を行い、(is_constructible_v<CTypes, decltype(celems)> && ...) == trueであること。
      • nsizeof...(Tuples)とし、iを範囲[0, n)における整数値とする
      • T(i)Tuplesi番目とする
      • U(i)remove_cvref_t<T(i)> とする
      • tp(i)をパラメータパックtplsi番目とする
      • S(i)tuple_size_v<U(i)>とする
      • E(i,k)tuple_element_t<k, U(i)>とする
      • e(i,k)get<k>(std::forward<T(i)>(tp(i)))とする
      • Elems(i)を型パラメータパックE(i,0), ..., E(i,Si-1)とする
      • elems(i)をパラメータパックe(i,0), ..., e(i,Si-1)とする
      • Ctypesを型パラメーターパックElems(0)..., Elems(1)..., ..., Elems(n-1)...とする
      • celemsをパラメーターパックelems(0)..., elems(1), ..., elems(n-1)...とする

戻り値

Tuples...の全てのtuple型の要素型全てを取り出し、std::forward<T>(x)して構築される1つのtuple`オブジェクト。

備考

実装によっては、Tuples... パラメータパックに含めることのできる型として、他のタプルライクな型(pairarrayのような)を追加的にサポートする可能性がある。(C++23からはtuple-likeを満たす型をサポートする。)

#include <iostream>
#include <tuple>
#include <string>

int main()
{
  std::tuple<int, std::string> t1(1, "Hello");
  std::tuple<char, double> t2('a', 3.14);
  std::tuple<std::string> t3("World");

  // 3つのtupleを繋ぎ合わせる
  std::tuple<int, std::string, char, double, std::string> result =
      std::tuple_cat(t1, t2, t3);

  std::cout << std::get<0>(result) << std::endl;
  std::cout << std::get<1>(result) << std::endl;
  std::cout << std::get<2>(result) << std::endl;
  std::cout << std::get<3>(result) << std::endl;
  std::cout << std::get<4>(result) << std::endl;
}

出力

1
Hello
a
3.14
World

バージョン

言語

  • C++11

処理系

参照