#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 |