Heim > Backend-Entwicklung > C++ > Hauptteil

Wie kann man ein „std::tuple' mithilfe von Variadic-Vorlagen in C 11 hübsch drucken?

Mary-Kate Olsen
Freigeben: 2024-11-10 00:21:02
Original
766 Leute haben es durchsucht

How can you pretty-print a `std::tuple` using variadic templates in C  11?

Pretty-Printing std::tuple

In einer früheren Frage zum Verschönern von STL-Containern haben wir erfolgreich eine umfassende und elegante Lösung entwickelt. Dieser nächste Schritt befasst sich mit dem Bereich des hübschen Druckens von std::tuple unter Verwendung verschiedener Vorlagen (ausschließlich C 11).

Hintergrund

Für std::pair gilt das Die Syntax ist unkompliziert:

std::ostream & operator<<(std::ostream &, const std::pair<S, T> &);
Nach dem Login kopieren

Analoge Konstruktion für Tupel

Das Rätsel besteht darin, eine analoge Konstruktion zum Drucken eines Tupels zu definieren. Wir streben dieses Verhalten an:

auto a = std::make_tuple(5, "Hello", -0.1);
std::cout << a << std::endl; // prints: (5, "Hello", -0.1)
Nach dem Login kopieren

Lösung

Die Antwort liegt in der Ausnutzung von Indizes:

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 << ")";
}
Nach dem Login kopieren

Bonus: Trennzeichen

Für zusätzliche Flexibilität bieten wir Teilspezialisierungen an:

// 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")" };
Nach dem Login kopieren

Fazit

Mit den oben genannten Modifikationen ist Pretty-Printing Standard: :tuple kann an verschiedene Zeichensätze und Trennzeichenpräferenzen angepasst werden und bietet eine elegante und vielseitige Lösung.

Das obige ist der detaillierte Inhalt vonWie kann man ein „std::tuple' mithilfe von Variadic-Vorlagen in C 11 hübsch drucken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage