Namespaces
Variants

std:: make_format_args, std:: make_wformat_args

From cppreference.net
Definiert im Header <format>
template < class Context = std:: format_context , class ... Args >

/*format-arg-store*/ < Context, Args... >

make_format_args ( Args & ... args ) ;
(1) (seit C++20)
template < class ... Args >

/*format-arg-store*/ < std:: wformat_context , Args... >

make_wformat_args ( Args & ... args ) ;
(2) (seit C++20)

Gibt ein Objekt zurück, das ein Array von Formatierungsargumenten speichert und implizit in std::basic_format_args<Context> konvertiert werden kann.

Das Verhalten ist undefiniert, wenn typename Context :: template formatter_type < std:: remove_const_t < Ti >> nicht den BasicFormatter -Anforderungen für irgendein Ti in Args entspricht.

Das Programm ist fehlerhaft, wenn für irgendeinen Typ Ti in Args , Ti nicht __formattable_with < Context > erfüllt.

2) Entspricht return std :: make_format_args < std:: wformat_context > ( args... ) ; .

Inhaltsverzeichnis

Parameter

args... - Werte, die als Formatierungsargumente verwendet werden

Rückgabewerte

Ein Objekt, das die Formatierungsargumente enthält.

Für jedes Argument t vom Typ T sei TD definiert als std:: remove_const_t < std:: remove_reference_t < T >> . Das entsprechende std::basic_format_arg im Ergebnis wird wie folgt bestimmt:

Hinweise

Ein Formatierungsargument hat Referenzsemantik für benutzerdefinierte Typen und verlängert nicht die Lebensdauer von args . Es liegt in der Verantwortung des Programmierers, sicherzustellen, dass args den Rückgabewert überdauern. Normalerweise wird das Ergebnis nur als Argument für Formatierungsfunktionen verwendet.

Feature-Test Makro Wert Std Funktion
__cpp_lib_format_uchar 202311L (C++20)
(DR)
Formatierung von Code-Einheiten als vorzeichenlose Ganzzahlen

Beispiel

#include <array>
#include <format>
#include <iostream>
#include <string_view>
void raw_write_to_log(std::string_view users_fmt, std::format_args&& args)
{
    static int n{};
    std::clog << std::format("{:04} : ", n++) << std::vformat(users_fmt, args) << '\n';
}
template<typename... Args>
constexpr void log(Args&&... args)
{
    // Formatierungszeichenkette "{} "... generieren
    std::array<char, sizeof...(Args) * 3 + 1> braces{};
    constexpr const char c[4] = "{} ";
    for (auto i{0uz}; i != braces.size() - 1; ++i)
        braces[i] = c[i % 3];
    braces.back() = '\0';
    raw_write_to_log(std::string_view{braces.data()}, std::make_format_args(args...));
}
template<typename T>
const T& unmove(T&& x)
{
    return x;
}
int main()
{
    log("Number", "of", "arguments", "is", "arbitrary.");
    log("Any type that meets the BasicFormatter requirements", "can be printed.");
    log("For example:", 1, 2.0, '3', "*42*");
    raw_write_to_log("{:02} │ {} │ {} │ {}",
                     std::make_format_args(unmove(1), unmove(2.0), unmove('3'), "4"));
}

Ausgabe:

0000 : Number of arguments is arbitrary.
0001 : Any type that meets the BasicFormatter requirements can be printed.
0002 : For example: 1 2.0 3 *42*
0003 : 01 │ 2.0 │ 3 │ 4

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
P2418R2 C++20 Objekte, die weder const-verwendbar noch kopierbar sind
(wie generator-ähnliche Objekte) sind nicht formatierbar
Formatierung dieser Objekte ermöglichen
P2905R2 C++20 make_format_args akzeptierte Rvalue-Argumente durch Forwarding-Referenzen nimmt nur Lvalue-Referenzen
P2909R4 C++20 char oder wchar_t könnten als
unsigned Integer-Werte außerhalb des Bereichs formatiert werden
Code-Einheiten werden vor einer solchen Formatierung in den entsprechenden
unsigned Typ konvertiert
LWG 3631 C++20 CV-qualifizierte Argumente wurden nach P2418R2 falsch behandelt Behandlung korrigiert

Siehe auch

Klasse, die Zugriff auf alle Formatierungsargumente bereitstellt
(Klassentemplate)
(C++20)
Nicht-Template-Variante von std::format mit typerodierter Argumentdarstellung
(Funktion)
(C++20)
Nicht-Template-Variante von std::format_to mit typerodierter Argumentdarstellung
(Funktionstemplate)