Namespaces
Variants

std:: format_to_n, std:: format_to_n_result

From cppreference.net
Definiert in Header <format>
template < class OutputIt, class ... Args >

std :: format_to_n_result < OutputIt >
format_to_n ( OutputIt out, std:: iter_difference_t < OutputIt > n,

std:: format_string < Args... > fmt, Args && ... args ) ;
(1) (seit C++20)
template < class OutputIt, class ... Args >

std :: format_to_n_result < OutputIt >
format_to_n ( OutputIt out, std:: iter_difference_t < OutputIt > n,

std:: wformat_string < Args... > fmt, Args && ... args ) ;
(2) (seit C++20)
template < class OutputIt, class ... Args >

std :: format_to_n_result < OutputIt >
format_to_n ( OutputIt out, std:: iter_difference_t < OutputIt > n,
const std:: locale & loc,

std:: format_string < Args... > fmt, Args && ... args ) ;
(3) (seit C++20)
template < class OutputIt, class ... Args >

std :: format_to_n_result < OutputIt >
format_to_n ( OutputIt out, std:: iter_difference_t < OutputIt > n,
const std:: locale & loc,

std:: wformat_string < Args... > fmt, Args && ... args ) ;
(4) (seit C++20)
Hilfstypen
template < class OutputIt >

struct format_to_n_result {
OutputIt out ;
std:: iter_difference_t < OutputIt > size ;

} ;
(5) (seit C++20)

Formatiere args gemäß der Formatzeichenkette fmt und schreibe das Ergebnis an den Ausgabeiterator out . Es werden maximal n Zeichen geschrieben. Falls vorhanden, wird loc für lokalisierungsabhängige Formatierung verwendet.

Lassen Sie CharT für Überladungen (1,3) char sein und wchar_t für Überladungen (2,4) .

Diese Überladungen nehmen nur dann an der Überladungsauflösung teil, wenn OutputIt das Konzept std:: output_iterator < const CharT & > erfüllt.

Das Verhalten ist undefiniert, wenn OutputIt nicht das Konzept std:: output_iterator < const CharT & > erfüllt (die semantischen Anforderungen nicht erfüllt), oder wenn std:: formatter < std:: remove_cvref_t < Ti > , CharT > die BasicFormatter Anforderungen für irgendein Ti in Args nicht erfüllt.

5) std::format_to_n_result besitzt keine Basisklassen oder Member außer out , size und implizit deklarierten speziellen Memberfunktionen.

Inhaltsverzeichnis

Parameter

out - Iterator zum Ausgabepuffer
n - Maximale Anzahl der in den Puffer zu schreibenden Zeichen
fmt - Ein Objekt, das die Formatzeichenkette repräsentiert. Die Formatzeichenkette besteht aus
  • gewöhnlichen Zeichen (außer { und } ), die unverändert in die Ausgabe kopiert werden,
  • Escape-Sequenzen { { und } } , die in der Ausgabe durch { bzw. } ersetzt werden, und
  • Ersetzungsfeldern.

Jedes Ersetzungsfeld hat folgendes Format:

{ arg-id (optional) } (1)
{ arg-id (optional) : format-spec } (2)
1) Ersetzungsfeld ohne Formatangabe
2) Ersetzungsfeld mit Formatangabe
arg-id - gibt den Index des Arguments in args an, dessen Wert für die Formatierung verwendet werden soll; falls ausgelassen, werden die Argumente in Reihenfolge verwendet.

Die arg-id s in einer Formatzeichenkette müssen entweder alle angegeben oder alle ausgelassen werden. Das Vermischen manueller und automatischer Indizierung ist ein Fehler.

format-spec - die Formatangabe, definiert durch die std::formatter Spezialisierung für das entsprechende Argument. Darf nicht mit } beginnen.

(seit C++23)
(seit C++26)
  • Für andere formatierbare Typen wird die Formatangabe durch benutzerdefinierte formatter Spezialisierungen bestimmt.
args... - zu formatierende Argumente
loc - std::locale für lokalisierungsspezifische Formatierung

Rückgabewert

Ein format_to_n_result bei dem das out Mitglied ein Iterator hinter dem Ende des Ausgabebereichs ist und das size Mitglied die gesamte (nicht abgeschnittene) Ausgabegröße darstellt.

Ausnahmen

Leitet alle Ausnahmen weiter, die durch Formatierer- oder Iterator-Operationen ausgelöst werden.

Hinweise

Die libstdc++-Implementierung vor GCC-13.3 hatte einen Fehler bei der Meldung des korrekten format_to_n_result :: out -Werts.

Beispiel

Auf Godbolt's Compiler Explorer: clang (trunk) + libc++ , GCC (trunk) + libstdc++ .

#include <format>
#include <initializer_list>
#include <iomanip>
#include <iostream>
#include <string_view>
int main()
{
    char buffer[64];
    for (std::size_t max_chars_to_write : {std::size(buffer) - 1, 23uz, 21uz})
    {
        const std::format_to_n_result result =
            std::format_to_n(
                buffer, max_chars_to_write,
                "Hubble's H{2} {3} {0}{4}{1} km/sec/Mpc.", // 24 bytes w/o formatters
                71,       // {0}, occupies 2 bytes
                8,        // {1}, occupies 1 byte
                "\u2080", // {2}, occupies 3 bytes, '₀' (SUBSCRIPT ZERO)
                "\u2245", // {3}, occupies 3 bytes, '≅' (APPROXIMATELY EQUAL TO)
                "\u00B1"  // {4}, occupies 2 bytes, '±' (PLUS-MINUS SIGN)
                ); // 24 + 2 + 1 + 3 + 3 + 2 == 35, no trailing '\0'
        *result.out = '\0'; // adds terminator to buffer
        const std::string_view str(buffer, result.out);
        std::cout << "Buffer until '\\0': " << std::quoted(str) << '\n'
                  << "Max chars to write: " << max_chars_to_write << '\n'
                  << "result.out offset: " << result.out - buffer << '\n'
                  << "Untruncated output size: " << result.size << "\n\n";
    }
}

Ausgabe:

Buffer until '\0': "Hubble's H₀ ≅ 71±8 km/sec/Mpc."
Max chars to write: 63
result.out offset: 35
Untruncated output size: 35
Buffer until '\0': "Hubble's H₀ ≅ 71±8"
Max chars to write: 23
result.out offset: 23
Untruncated output size: 35
Buffer until '\0': "Hubble's H₀ ≅ 71�"
Max chars to write: 21
result.out offset: 21
Untruncated output size: 35

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
P2216R3 C++20 wirft std::format_error für ungültige Formatzeichenfolge ungültige Formatzeichenfolge führt zu Compilezeit-Fehler
P2418R2 C++20 Objekte, die weder const-verwendbar noch kopierbar sind
(wie Generator-ähnliche Objekte) sind nicht formatierbar
Formatierung dieser Objekte erlauben
P2508R1 C++20 es gibt keinen für Benutzer sichtbaren Namen für diese Einrichtung der Name basic_format_string wird verfügbar gemacht

Siehe auch

(C++20)
speichert die formatierte Darstellung der Argumente in einem neuen String
(Funktions-Template)
(C++20)
gibt die formatierte Darstellung seiner Argumente über einen Output-Iterator aus
(Funktions-Template)
bestimmt die Anzahl der Zeichen, die zur Speicherung der formatierten Darstellung seiner Argumente erforderlich sind
(Funktions-Template)