std:: make_format_args, std:: make_wformat_args
|
Definido en el encabezado
<format>
|
||
|
template
<
class
Context
=
std::
format_context
,
class
...
Args
>
/*format-arg-store*/
<
Context, Args...
>
|
(1) | (desde C++20) |
|
template
<
class
...
Args
>
/*format-arg-store*/
<
std::
wformat_context
, 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
>
.
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:
-
si
TDes bool oContext::char_type, el std::basic_format_arg almacena t ; -
de lo contrario, si
TDes char yContext::char_typees wchar_t , el std::basic_format_arg almacena static_cast < wchar_t > ( static_cast < unsigned char > ( t ) ) ; -
de lo contrario, si
TDes un tipo entero con signo cuyo tamaño no es mayor que int , el std::basic_format_arg almacena static_cast < int > ( t ) ; -
de lo contrario, si
TDes un tipo entero sin signo cuyo tamaño no es mayor que unsigned int , el std::basic_format_arg almacena static_cast < unsigned int > ( t ) ; -
de lo contrario, si
TDes un tipo entero con signo cuyo tamaño no es mayor que long long , el std::basic_format_arg almacena static_cast < long long > ( t ) ; -
de lo contrario, si
TDes un tipo entero sin signo cuyo tamaño no es mayor que unsigned long long , el std::basic_format_arg almacena static_cast < unsigned long long > ( t ) ; -
de lo contrario, si
TDes float , double , o long double , el std::basic_format_arg almacena t ; -
de lo contrario, si
TDes una especialización de std::basic_string_view o std::basic_string yTD::char_typeesContext::char_type, el std::basic_format_arg almacena std:: basic_string_view < Context :: char_type > ( t. data ( ) , t. size ( ) ) ; - de lo contrario, si std:: decay_t < TD > es Context :: char_type * o const Context :: char_type * , el std::basic_format_arg almacena static_cast < const Context :: char_type * > ( t ) ;
- de lo contrario, si std:: is_void_v < std:: remove_pointer_t < TD >> es true o std:: is_null_pointer_v < TD > es true , el std::basic_format_arg almacena static_cast < const void * > ( t ) ;
-
de lo contrario, el
std::basic_format_arg
almacena un
std::
basic_format_arg
<
Context
>
::
handle
para
t, junto con los datos adicionales necesarios parahandle::format().
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
|
(C++20)
(C++20)
(C++20)
|
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) |