tuple_cat
tuple_cat (튜플 연결)
tuple_cat은 여러 튜플들을 하나의 튜플로 이어 붙이는 함수예요. C++11부터 사용할 수 있으며, C++14부터는 constexpr로 동작해요. C++23부터는 std::tuple뿐 아니라 tuple-like 프로토콜을 따르는 다른 타입들도 지원해요.
출처: cppreference
본문
tuple_cat은 인자로 받은 모든 튜플들의 원소들을 순서대로 연결한 새로운 std::tuple 객체를 생성해요. 반환되는 튜플의 원소 타입들(/* CTypes */)은 각 튜플의 원소 타입 팩을 순서대로 연결해서 만들어져요.
<tuple> 헤더에 정의됨 |
||
|---|---|---|
template < class ... Tuples > std :: tuple < /* CTypes */ ... > tuple_cat ( Tuples && ... args ); |
(C++11부터) (C++14까지) | |
template < class ... Tuples > constexpr std :: tuple < /* CTypes */ ... > tuple_cat ( Tuples && ... args ); |
(C++14부터) (C++23까지) | |
template < tuple - like ... Tuples > constexpr std :: tuple < /* CTypes */ ... > tuple_cat ( Tuples && ... args ); |
(C++23부터) |
동작 조건
std::decay_t<Tuples>... 중 어떤 타입이 std::tuple의 특수화가 아니라면 동작이 정의되지 않아요. 다만 구현에 따라 std::array나 std::pair처럼 tuple-like 프로토콜을 따르는 타입을 지원할 수도 있어요. |
(C++23까지) |
|---|---|
std::decay_t<Tuples>... 타입들은 tuple-like로 제약되어 있어요. 즉 각 타입은 std::tuple의 특수화이거나 std::array, std::pair처럼 tuple-like 모델을 만족하는 다른 타입이어야 해요. |
(C++23부터) |
/* CTypes */ 중 어떤 타입이 args에서 연결된 원소 시퀀스의 대응 원소 타입으로부터 생성 불가능하다면, C++23까지는 동작이 정의되지 않고, C++23부터는 프로그램이 ill-formed예요.
매개변수
args |
- | 연결할 0개 이상의 튜플들 |
|---|
반환값
모든 인자 튜플의 모든 원소들로 구성된 std::tuple 객체예요. 각 개별 원소는 std::get<j>(std::forward<Ti>(arg))로 생성돼요.
예제
#include <iostream>
#include <string>
#include <tuple>
// helper function to print a tuple of any size
template<class Tuple, std::size_t N>
struct TuplePrinter
{
static void print(const Tuple& t)
{
TuplePrinter<Tuple, N - 1>::print(t);
std::cout << ", " << std::get<N-1>(t);
}
};
template<class Tuple>
struct TuplePrinter<Tuple, 1>
{
static void print(const Tuple& t)
{
std::cout << std::get<0>(t);
}
};
template<typename... Args, std::enable_if_t<sizeof...(Args) == 0, int> = 0>
void print(const std::tuple<Args...>& t)
{
std::cout << "()\n";
}
template<typename... Args, std::enable_if_t<sizeof...(Args) != 0, int> = 0>
void print(const std::tuple<Args...>& t)
{
std::cout << "(";
TuplePrinter<decltype(t), sizeof...(Args)>::print(t);
std::cout << ")\n";
}
// end helper function
int main()
{
std::tuple<int, std::string, float> t1(10, "Test", 3.14);
int n = 7;
auto t2 = std::tuple_cat(t1, std::make_tuple("Foo", "bar"), t1, std::tie(n));
n = 42;
print(t2);
}
출력:
(10, Test, 3.14, Foo, bar, 10, Test, 3.14, 42)
같이 보기
make_tuple (C++11) |
인자 타입들로 정의된 튜플 객체를 생성해요 (함수 템플릿) [edit] |
|---|---|
tie (C++11) |
lvalue 참조들의 튜플을 만들거나 튜플을 개별 객체로 풀어줘요 (함수 템플릿) [edit] |
forward_as_tuple (C++11) |
전달 참조들의 튜플을 생성해요 (함수 템플릿) [edit] |