Pretty Printing std::tuple
이전 질문에서 Pretty Printing STL 컨테이너에 대한 일반적인 솔루션에 대해 논의했습니다. 이제 가변 템플릿(C 11 이상)을 사용하여 std::tuple을 처리하도록 솔루션을 확장해 보겠습니다.
튜플 인쇄를 위한 유사한 구성
std와 유사: :pair, 튜플을 예쁘게 인쇄하려면 요소를 괄호로 묶고 쉼표로 구분해야 합니다. 목표는 다음 동작을 달성하는 것입니다.
auto a = std::make_tuple(5, "Hello", -0.1); std::cout << a << std::endl; // prints: (5, "Hello", -0.1)
Variadic 솔루션
이를 달성하기 위해 우리는 일련의 시퀀스를 생성하기 위한 도우미 구조체와 함께 가변 템플릿을 활용합니다. 지수. 해결책은 다음과 같습니다.
namespace aux { template<std::size_t... Is> struct seq{}; template<std::size_t N, std::size_t... Is> struct gen_seq : gen_seq<N-1, N-1, Is...>{}; template<std::size_t... Is> struct gen_seq<0, Is...> : seq<Is...>{}; template<class Ch, class Tr, class Tuple, std::size_t... Is> void print_tuple(std::basic_ostream<Ch, Tr>& os, Tuple const& t, seq<Is...>) { using swallow = int[]; (void)swallow{0, (void(os << (Is == 0? "" : ", ") << std::get<Is>(t)), 0)...}; } } // aux:: template<class Ch, class Tr, class... Args> auto operator<<(std::basic_ostream<Ch, Tr>& os, std::tuple<Args...> const& t) -> std::basic_ostream<Ch, Tr>& { os << "("; aux::print_tuple(os, t, aux::gen_seq<sizeof...(Args)>()); return os << ")"; }
이 솔루션은 괄호 안에 쉼표로 구분된 요소를 사용하여 튜플을 우아하게 인쇄합니다.
사용자 정의 구분 기호
유연성을 더하기 위해 , 다음 부분 특수화를 추가하여 튜플에 대한 사용자 정의 구분 기호를 포함할 수 있습니다.
// Delimiters for tuple template<class... Args> struct delimiters<std::tuple<Args...>, char> { static const delimiters_values<char> values; }; template<class... Args> const delimiters_values<char> delimiters<std::tuple<Args...>, char>::values = { "(", ", ", ")" }; template<class... Args> struct delimiters<std::tuple<Args...>, wchar_t> { static const delimiters_values<wchar_t> values; }; template<class... Args> const delimiters_values<wchar_t> delimiters<std::tuple<Args...>, wchar_t>::values = { L"(", L", ", L")" };
이러한 특수화를 통합하면 std::tuple에 대한 구분 기호도 사용자 정의할 수 있습니다.
위 내용은 C에서 가변 템플릿을 사용하여 std::tuple을 어떻게 예쁘게 인쇄할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!