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...>であること。Tuples...の各型が左辺値参照であればその要素型Args...の各型はコピー構築可能、そうでなければムーブ構築可能であること。
- C++23から :
- 本関数の戻り値の
tupleのテンプレートパラメーターパックをCtypesとし、Ctypesの全ての要素について、引数tplsにおいて対応する要素の型から構築可能であること。 - より厳密には、次のように定義を行い、
(is_constructible_v<CTypes, decltype(celems)> && ...) == trueであること。nをsizeof...(Tuples)とし、iを範囲[0, n)における整数値とするT(i)をTuplesのi番目とするU(i)をremove_cvref_t<T(i)>とするtp(i)をパラメータパックtplsのi番目とする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... パラメータパックに含めることのできる型として、他のタプルライクな型(pairやarrayのような)を追加的にサポートする可能性がある。(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
処理系
- Clang: ??
- GCC: 4.6.1 ✅
- ICC: ??
- Visual C++: ??