Namensräume
Varianten
Aktionen

std::formatter

Von cppreference.com
< cpp‎ | utility‎ | format
 
 
 
 
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

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.

Deaktivierte Formatter 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-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 parse analysierten Format-Spezifizierers ?.

Jede Formatter-Spezialisierung für Zeichen- oder String-Typen ist *debug-aktiviert*.

(seit C++23)

[bearbeiten] Standard-Format-Spezifikation

[bearbeiten] Standard-Spezialisierungen für Bibliothekstypen

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

[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

Formatierungsstatus, einschließlich aller Formatierungsargumente und des Output-Iterators
(Klassentemplate) [bearbeiten]
gibt an, dass ein Typ formatierbar ist, d.h., er spezialisiert std::formatter und stellt die Member-Funktionen parse und format bereit
(Konzept) [bearbeiten]
Klassenvorlage, die bei der Implementierung von std::formatter-Spezialisierungen für Bereichstypen hilft
(Klassentemplate) [bearbeiten]