Heim > Artikel > Backend-Entwicklung > Wie kann ich ein std::tuple mit variadic-Vorlagen in C hübsch drucken?
Pretty Printing std::tuple
In einer früheren Frage haben wir eine allgemeine Lösung für Pretty-Printing-STL-Container besprochen. Erweitern wir nun diese Lösung, um std::tuple mit variadischen Vorlagen (C 11 oder höher) zu verarbeiten.
Analoge Konstruktion zum Drucken eines Tupels
Ähnlich wie std: :pair, um ein Tupel hübsch zu drucken, müssen die Elemente in Klammern gesetzt und durch Kommas getrennt werden. Das Ziel besteht darin, das folgende Verhalten zu erreichen:
auto a = std::make_tuple(5, "Hello", -0.1); std::cout << a << std::endl; // prints: (5, "Hello", -0.1)
Variadic Solution
Um dies zu erreichen, verwenden wir Variadic-Vorlagen zusammen mit einer Hilfsstruktur zum Generieren einer Sequenz von Indizes. Hier ist die Lösung:
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 << ")"; }
Diese Lösung druckt Tupel auf elegante Weise mit durch Kommas getrennten Elementen in Klammern.
Benutzerdefinierte Trennzeichen
Für zusätzliche Flexibilität können Sie benutzerdefinierte Trennzeichen für Tupel einschließen, indem Sie die folgenden Teilspezialisierungen hinzufügen:
// 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")" };
Durch die Einbindung dieser Spezialisierungen können Sie auch die Trennzeichen für std::tuple anpassen.
Das obige ist der detaillierte Inhalt vonWie kann ich ein std::tuple mit variadic-Vorlagen in C hübsch drucken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!