Namespaces
Variants

std:: make_format_args, std:: make_wformat_args

From cppreference.net
Definido en el encabezado <format>
template < class Context = std:: format_context , class ... Args >

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

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

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

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

Retorna un objeto que almacena un array de argumentos de formato y puede convertirse implícitamente a std::basic_format_args<Context> .

El comportamiento es indefinido si typename Context :: template formatter_type < std:: remove_const_t < Ti >> no cumple con los requisitos de BasicFormatter para cualquier Ti en Args .

El programa está mal formado si para cualquier tipo Ti en Args , Ti no satisface __formattable_with < Context > .

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

Contenidos

Parámetros

args... - valores a utilizar como argumentos de formato

Devuelve

Un objeto que contiene los argumentos de formato.

Para cada argumento t de tipo T , sea TD igual a std:: remove_const_t < std:: remove_reference_t < T >> . El correspondiente std::basic_format_arg en el resultado se determina como se indica a continuación:

Notas

Un argumento de formato tiene semántica de referencia para tipos definidos por el usuario y no extiende el tiempo de vida de args . Es responsabilidad del programador garantizar que args sobrevivan al valor de retorno. Normalmente, el resultado solo se utiliza como argumento para funciones de formato.

Macro de prueba de características Valor Std Característica
__cpp_lib_format_uchar 202311L (C++20)
(DR)
Formateo de unidades de código como enteros sin signo

Ejemplo

#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)
{
    // Generar cadena de formato "{} "...
    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"));
}

Salida:

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Se aplica a Comportamiento publicado Comportamiento correcto
P2418R2 C++20 objetos que no son const-usable ni copiables
(como objetos tipo generator) no son formateables
permitir formatear estos objetos
P2905R2 C++20 make_format_args aceptaba argumentos rvalue mediante referencias de reenvío solo toma referencias lvalue
P2909R4 C++20 char o wchar_t podrían formatearse como
valores enteros sin signo fuera de rango
las unidades de código se convierten al tipo
sin signo correspondiente antes de dicho formateo
LWG 3631 C++20 argumentos con calificación cv se manejaban incorrectamente después de P2418R2 manejo corregido

Véase también

clase que proporciona acceso a todos los argumentos de formato
(plantilla de clase)
(C++20)
variante no plantilla de std::format que utiliza representación de argumentos con borrado de tipo
(función)
(C++20)
variante no plantilla de std::format_to que utiliza representación de argumentos con borrado de tipo
(plantilla de función)