Namespaces
Variants

std:: format

From cppreference.net
Definido en el encabezado <format>
template < class ... Args >
std:: string format ( std:: format_string < Args... > fmt, Args && ... args ) ;
(1) (desde C++20)
template < class ... Args >
std:: wstring format ( std:: wformat_string < Args... > fmt, Args && ... args ) ;
(2) (desde C++20)
template < class ... Args >

std:: string format ( const std:: locale & loc,

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

std:: wstring format ( const std:: locale & loc,

std:: wformat_string < Args... > fmt, Args && ... args ) ;
(4) (desde C++20)

Formatea args de acuerdo con la cadena de formato fmt , y devuelve el resultado como una cadena. Si está presente, loc se utiliza para el formato específico de la configuración regional.

1) Equivalente a return std:: vformat ( fmt. get ( ) , std:: make_format_args ( args... ) ) ; .
2) Equivalente a return std:: vformat ( fmt. get ( ) , std:: make_wformat_args ( args... ) ) ; .
3) Equivalente a return std:: vformat ( loc, fmt. get ( ) , std:: make_format_args ( args... ) ) ; .
4) Equivalente a return std:: vformat ( loc, fmt. get ( ) , std:: make_wformat_args ( args... ) ) ; .

La cadena de formato fmt se verifica en tiempo de compilación a menos que se inicialice a partir del resultado de std::runtime_format (desde C++26) . Si, en tiempo de compilación, se encuentra que la cadena de formato es inválida para los tipos de los argumentos a formatear, se emitirá un error de compilación.

Los siguientes requisitos se aplican a cada tipo T en Args , donde CharT es char para las sobrecargas (1,3) , wchar_t para las sobrecargas (2,4) :

Contenidos

Parámetros

fmt - un objeto que representa la cadena de formato. La cadena de formato consiste en
  • caracteres ordinarios (excepto { y } ), que se copian sin cambios a la salida,
  • secuencias de escape { { y } } , que se reemplazan con { y } respectivamente en la salida, y
  • campos de reemplazo.

Cada campo de reemplazo tiene el siguiente formato:

{ arg-id (opcional) } (1)
{ arg-id (opcional) : format-spec } (2)
1) campo de reemplazo sin especificación de formato
2) campo de reemplazo con especificación de formato
arg-id - especifica el índice del argumento en args cuyo valor se utilizará para el formato; si se omite, los argumentos se utilizan en orden.

Los arg-id s en una cadena de formato deben estar todos presentes o todos omitidos. Mezclar indexación manual y automática es un error.

format-spec - la especificación de formato definida por la especialización de std::formatter para el argumento correspondiente. No puede comenzar con } .

(since C++23)
(since C++26)
  • Para otros tipos formateables, la especificación de formato está determinada por especializaciones formatter definidas por el usuario.
args... - argumentos a formatear
loc - std::locale utilizado para el formato específico de la configuración regional

Valor de retorno

Un objeto string que contiene el resultado formateado.

Excepciones

Lanza std::bad_alloc en caso de fallo de asignación de memoria. También propaga excepciones lanzadas por cualquier formateador.

Notas

No es un error proporcionar más argumentos de los que requiere la cadena de formato:

std::format("{} {}!", "Hello", "world", "something"); // OK, produce "Hello world!"

Es un error si la cadena de formato no es una expresión constante a menos que se inicialice a partir del resultado de std::runtime_format (desde C++26) . std::vformat no tiene este requisito.

std::string f1(std::string_view runtime_format_string)
{
    // return std::format(runtime_format_string, "x", 42); // error
    char v1[] = "x";
    int v2 = 42;
    return std::vformat(runtime_format_string, std::make_format_args(v1, v2)); // OK
}
std::string f2(std::string_view runtime_format_string)
{
    return std::format(std::runtime_format(runtime_format_string), "x", 42); // OK (C++26)
}

Ejemplo

#include <format>
#include <iostream>
#include <set>
#include <string>
#include <string_view>
template<typename... Args>
std::string dyna_print(std::string_view rt_fmt_str, Args&&... args)
{
    return std::vformat(rt_fmt_str, std::make_format_args(args...));
}
int main()
{
#ifdef __cpp_lib_format_ranges
        const std::set<std::string_view> continents 
        {
            "Africa",   "America",      "Antarctica",   
            "Asia",     "Australia",    "Europe"
        };
        std::cout << std::format("Hello {}!\n", continents);
#else
        std::cout << std::format("Hello {}!\n", "continents");
#endif
    std::string fmt;
    for (int i{}; i != 3; ++i)
    {
        fmt += "{} "; // construye la cadena de formato
        std::cout << fmt << " : ";
        std::cout << dyna_print(fmt, "alpha", 'Z', 3.14, "unused");
        std::cout << '\n';
    }
}

Salida posible:

Hello {"Africa", "America", "Antarctica", "Asia", "Australia", "Europe"}!
{}  : alpha
{} {}  : alpha Z
{} {} {}  : alpha Z 3.14

Informes de defectos

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

DR Aplicado a Comportamiento publicado Comportamiento correcto
P2216R3 C++20 lanza std::format_error para cadena de formato inválida cadena de formato inválida resulta en error en tiempo de compilación
P2418R2 C++20 objetos que no son ni const-usables ni copiables
(como objetos tipo generador) no son formateables
permitir formatear estos objetos
P2508R1 C++20 no hay nombre visible para el usuario para esta facilidad el nombre basic_format_string está expuesto

Véase también

(C++20)
escribe una representación formateada de sus argumentos a través de un iterador de salida
(plantilla de función)
escribe una representación formateada de sus argumentos a través de un iterador de salida, sin exceder un tamaño especificado
(plantilla de función)