std::formatter
| Definiert in Header <format> |
||
| template< class T, class CharT = char > struct formatter; |
(seit C++20) | |
Die aktivierten Spezialisierungen von std::formatter definieren Formatierungsregeln für einen gegebenen Typ. Aktivierte Spezialisierungen erfüllen die Anforderungen von BasicFormatter und, sofern nicht anders angegeben, auch die Anforderungen von Formatter.
Für alle Typen T und CharT, für die keine Spezialisierung std::formatter<T, CharT> aktiviert ist, ist diese Spezialisierung ein vollständiger Typ und ist deaktiviert.
Deaktivierte Spezialisierungen erfüllen nicht die Anforderungen von Formatter, und die folgenden sind alle false
- std::is_default_constructible_v
- std::is_copy_constructible_v
- std::is_move_constructible_v
- std::is_copy_assignable_v
- std::is_move_assignable_v.
Inhalt |
[bearbeiten] Grundlegende Standard-Spezialisierungen
In der folgenden Liste ist CharT entweder char oder wchar_t, ArithmeticT ist jeder cv-unqualifizierte arithmetische Typ außer char, wchar_t, char8_t, char16_t oder char32_t
| Zeichen-Formatter |
||
| template<> struct formatter<char, char>; |
(1) | |
| template<> struct formatter<char, wchar_t>; |
(2) | |
| template<> struct formatter<wchar_t, wchar_t>; |
(3) | |
| String-Formatter |
||
| template<> struct formatter<CharT*, CharT>; |
(4) | |
| template<> struct formatter<const CharT*, CharT>; |
(5) | |
| template< std::size_t N > struct formatter<CharT[N], CharT>; |
(6) | |
| template< class Traits, class Alloc > struct formatter<std::basic_string<CharT, Traits, Alloc>, CharT>; |
(7) | |
| template< class Traits > struct formatter<std::basic_string_view<CharT, Traits>, CharT>; |
(8) | |
| Arithmetische Formatter |
||
| template<> struct formatter<ArithmeticT, CharT>; |
(9) | |
| Zeiger-Formatter |
||
| template<> struct formatter<std::nullptr_t, CharT>; |
(10) | |
| template<> struct formatter<void*, CharT>; |
(11) | |
| template<> struct formatter<const void*, CharT>; |
(12) | |
Formatter für andere Zeiger und Zeiger auf Member sind deaktiviert.
Spezialisierungen wie std::formatter<wchar_t, char> und std::formatter<const char*, wchar_t>, die Kodierungskonvertierungen erfordern würden, sind deaktiviert.
|
Die folgenden Spezialisierungen sind in C++23 weiterhin deaktiviert, um die Formatierung einiger char-Sequenzen als Bereiche von wchar_t zu vermeiden.
Eine *debug-aktivierte* Formatter-Spezialisierung stellt zusätzlich eine öffentliche nicht-statische Member-Funktion constexpr void set_debug_format(); bereit, die den Zustand des Formatter-Objekts so modifiziert, dass es Werte als escaped und zitiert formatiert, als wäre der *Typ* des durch den letzten Aufruf von Jede Formatter-Spezialisierung für Zeichen- oder String-Typen ist *debug-aktiviert*. |
(seit C++23) |
[bearbeiten] Standard-Format-Spezifikation
| Dieser Abschnitt ist unvollständig Grund: Die Standard-Format-Spezifikation wurde auf eine separate Seite verschoben. Der Abschnittstitel wurde vorübergehend für Links zu diesem Abschnitt beibehalten. Dieser Abschnitt wird entfernt, sobald alle Links entsprechend angepasst sind. |
[bearbeiten] Standard-Spezialisierungen für Bibliothekstypen
Formatierungsunterstützung für duration(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für sys_time(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für utc_time(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für tai_time(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für gps_time(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für file_time(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für local_time(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für day(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für month(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für year(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für weekday(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für weekday_indexed(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für weekday_last(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für month_day(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für month_day_last(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für month_weekday(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für month_weekday_last(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für year_month(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für year_month_day(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für year_month_day_last(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für year_month_weekday(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für year_month_weekday_last(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für hh_mm_ss(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für sys_info(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für local_info(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für zoned_time(Klassentemplate-Spezialisierung) | |
Formatierungsunterstützung für basic_stacktrace(Klassenvorlagenspezialisierung) | |
Formatierungsunterstützung für stacktrace_entry(Klassenvorlagenspezialisierung) | |
Formatierungsunterstützung für thread::id(Klassenvorlagenspezialisierung) | |
Formatierungsunterstützung für vector<bool>::reference(Klassenvorlagenspezialisierung) | |
Formatierungsunterstützung für pair und tuple(Klassenvorlagenspezialisierung) | |
| (C++23) |
Formatierungsunterstützung für Bereiche (Klassenvorlagenspezialisierung) |
| (C++23) |
Formatierungsunterstützung für std::stack(Klassenvorlagenspezialisierung) |
| (C++23) |
Formatierungsunterstützung für std::queue(Klassenvorlagenspezialisierung) |
Formatierungsunterstützung für std::priority_queue(Klassenvorlagenspezialisierung) | |
Formatierungsunterstützung für filesystem::path(Klassenvorlagenspezialisierung) |
[bearbeiten] Beispiel
#include <algorithm> #include <format> #include <iomanip> #include <iostream> #include <sstream> #include <string_view> struct QuotableString : std::string_view {}; template<> struct std::formatter<QuotableString, char> { bool quoted = false; template<class ParseContext> constexpr ParseContext::iterator parse(ParseContext& ctx) { auto it = ctx.begin(); if (it == ctx.end()) return it; if (*it == '#') { quoted = true; ++it; } if (it != ctx.end() && *it != '}') throw std::format_error("Invalid format args for QuotableString."); return it; } template<class FmtContext> FmtContext::iterator format(QuotableString s, FmtContext& ctx) const { std::ostringstream out; if (quoted) out << std::quoted(s); else out << s; return std::ranges::copy(std::move(out).str(), ctx.out()).out; } }; int main() { QuotableString a("be"), a2(R"( " be " )"); QuotableString b("a question"); std::cout << std::format("To {0} or not to {0}, that is {1}.\n", a, b); std::cout << std::format("To {0:} or not to {0:}, that is {1:}.\n", a, b); std::cout << std::format("To {0:#} or not to {0:#}, that is {1:#}.\n", a2, b); }
Ausgabe
To be or not to be, that is a question. To be or not to be, that is a question. To " \" be \" " or not to " \" be \" ", that is "a question".
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3944 | C++23 | einige char-Sequenzen konnten als Bereiche von wchar_t formatiert werden | Spezialisierungen deaktiviert |
[bearbeiten] Siehe auch
| (C++20)(C++20)(C++20) |
Formatierungsstatus, einschließlich aller Formatierungsargumente und des Output-Iterators (Klassentemplate) |
| (C++23) |
gibt an, dass ein Typ formatierbar ist, d.h., er spezialisiert std::formatter und stellt die Member-Funktionen parse und format bereit(Konzept) |
| (C++23) |
Klassenvorlage, die bei der Implementierung von std::formatter-Spezialisierungen für Bereichstypen hilft (Klassentemplate) |