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::arraystd::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]

더 알아보기 (Learn more)

cppreference