본문 바로가기
코드

tuple 출력

by ehei 2021. 1. 22.
#include <iostream>
#include <tuple>

template<typename TUPLE, size_t INDEX = std::tuple_size_v<TUPLE>>
std::ostream& print_tuple_element( std::ostream& os, TUPLE& t, char const* sep )
{
    if constexpr (INDEX > 1) { print_tuple_element<TUPLE, INDEX - 1>( os, t, sep ); }
    if constexpr (INDEX == 1) { sep = ""; }

    return os << sep << std::get<INDEX - 1>( t );
}

// https://stackoverflow.com/questions/2981836/how-can-i-use-cout-myclass
template<typename...Ts>
std::ostream& operator<<( std::ostream& os, std::tuple<Ts...>& t )
{
    return print_tuple_element( os, t, ", " );
}

int main()
{
    auto t = std::make_tuple(1, 2.f, "3");

    std::cout << t;
}

회사에서 듣는 템플릿 프로그래밍 온라인 수업 중 내준 과제가 튜플을 출력하는 코드를 짜는 것이었다. 처음에는 특수화를 하려고 했지만, 이쪽이 더 코드가 짧아서 바꿨다.

 

아래는 cppreference.com에서 발견한 더 좋은 예. 파라미터 언폴딩이 있다는 걸 깜박 했다.

// https://en.cppreference.com/w/cpp/utility/integer_sequence
template<class Ch, class Tr, class Tuple, std::size_t... Is>
void print_tuple_impl(std::basic_ostream<Ch,Tr>& os,
                      const Tuple& t,
                      std::index_sequence<Is...>)
{
    ((os << (Is == 0? "" : ", ") << std::get<Is>(t)), ...);
}
 
template<class Ch, class Tr, class... Args>
auto& operator<<(std::basic_ostream<Ch, Tr>& os,
                 const std::tuple<Args...>& t)
{
    os << "(";
    print_tuple_impl(os, t, std::index_sequence_for<Args...>{});
    return os << ")";
}

'코드' 카테고리의 다른 글

alignas  (0) 2021.02.03
make_index_sequence 구현  (0) 2021.01.27
std::remove_if  (0) 2021.01.21
instance in underlying array  (0) 2021.01.21
forward declaration of unique_ptr<T>  (0) 2021.01.21