Namespaces
Variants

std:: formatter

From cppreference.net
Definiert im 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 BasicFormatter Anforderungen und, sofern nicht anders angegeben, auch die Formatter Anforderungen.

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 Formatter -Anforderungen, und folgendes ist alles false :

*Hinweis: Da gemäß den Anforderungen keine HTML-Tags, Attribute, Code-Elemente oder C++-spezifische Begriffe übersetzt werden sollten, bleibt der gesamte Inhalt unverändert. Die C++-Typ-Traits (wie `std::is_default_constructible_v`) und alle HTML-Strukturen wurden bewahrt.*

Inhaltsverzeichnis

Grundlegende Standardspezialisierungen

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 :

Zeichenformatierer
template <>
struct formatter < char , char > ;
(1)
template <>
struct formatter < char , wchar_t > ;
(2)
template <>
struct formatter < wchar_t , wchar_t > ;
(3)
Zeichenkettenformatierer
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 Formatierer
template <>
struct formatter < ArithmeticT, CharT > ;
(9)
Zeigerformatierer
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 Kodierungsumwandlungen erfordern würden, sind deaktiviert.

Die folgenden Spezialisierungen sind in C++23 weiterhin deaktiviert, um zu vermeiden, dass bestimmte char -Sequenzen als Bereiche von wchar_t formatiert werden:

Deaktivierte Formatierer für wchar_t
template <>
struct formatter < char * , wchar_t > ;
(1)
template <>
struct formatter < const char * , wchar_t > ;
(2)
template < std:: size_t N >
struct formatter < char [ N ] , wchar_t > ;
(3)
template < class Traits, class Allocator >
struct formatter < std:: basic_string < char , Traits, Allocator > , wchar_t > ;
(4)
template < class Traits >
struct formatter < std:: basic_string_view < char , Traits > , wchar_t > ;
(5)

Eine debug-fähige Formatter-Spezialisierung bietet zusätzlich eine öffentliche nicht-statische Memberfunktion constexpr void set_debug_format ( ) ; , die den Zustand des Formatter-Objekts so modifiziert, dass es die Werte maskiert und in Anführungszeichen formatiert, als ob der Typ des Formatbezeichners, der durch den letzten Aufruf von parse analysiert wurde, ? gewesen wäre.

Jede Formatter-Spezialisierung für String- oder Zeichentypen ist debug-fähig .

(seit C++23)

Standardformat-Spezifikation

Standardspezialisierungen für Bibliothekstypen

Formatierungsunterstützung für duration
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für sys_time
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für utc_time
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für tai_time
(Klassen-Templatespezialisierung)
Formatierungsunterstützung für gps_time
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für file_time
(Klassentemplate-Spezialisierung)
Formatierungsunterstützung für local_time
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für day
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für month
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für year
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für weekday
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für weekday_indexed
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für weekday_last
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für month_day
(Klassen-Templatespezialisierung)
Formatierungsunterstützung für month_day_last
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für month_weekday
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für month_weekday_last
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für year_month
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für year_month_day
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für year_month_day_last
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für year_month_weekday
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für year_month_weekday_last
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für hh_mm_ss
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für sys_info
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für local_info
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für zoned_time
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für basic_stacktrace
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für stacktrace_entry
(Klassen-Templatespezialisierung)
Formatierungsunterstützung für thread::id
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für vector<bool>::reference
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für pair und tuple
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für Ranges
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für std::stack
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für std::queue
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für std::priority_queue
(Klassen-Template-Spezialisierung)
Formatierungsunterstützung für filesystem::path
(Klassen-Template-Spezialisierung)

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".

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 waren als Ranges von wchar_t formatierbar hinzugefügte Spezialisierungen deaktiviert

Siehe auch

Formatierungszustand, einschließlich aller Formatierungsargumente und des Ausgabeiterators
(Klassentemplate)
spezifiziert, dass ein Typ formatierbar ist, d.h. er spezialisiert std::formatter und stellt Memberfunktionen parse und format bereit
(Konzept)
Klassentemplate, das bei der Implementierung von std::formatter Spezialisierungen für Bereichstypen hilft
(Klassentemplate)