Namespaces
Variants

std:: format

From cppreference.net
Определено в заголовочном файле <format>
template < class ... Args >
std:: string format ( std:: format_string < Args... > fmt, Args && ... args ) ;
(1) (начиная с C++20)
template < class ... Args >
std:: wstring format ( std:: wformat_string < Args... > fmt, Args && ... args ) ;
(2) (начиная с C++20)
template < class ... Args >

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

std:: format_string < Args... > fmt, Args && ... args ) ;
(3) (начиная с C++20)
template < class ... Args >

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

std:: wformat_string < Args... > fmt, Args && ... args ) ;
(4) (начиная с C++20)

Форматируйте args в соответствии со строкой формата fmt и верните результат в виде строки. Если присутствует, loc используется для локализованного форматирования.

1) Эквивалентно return std:: vformat ( fmt. get ( ) , std:: make_format_args ( args... ) ) ; .
2) Эквивалентно return std:: vformat ( fmt. get ( ) , std:: make_wformat_args ( args... ) ) ; .
3) Эквивалентно return std:: vformat ( loc, fmt. get ( ) , std:: make_format_args ( args... ) ) ; .
4) Эквивалентно return std:: vformat ( loc, fmt. get ( ) , std:: make_wformat_args ( args... ) ) ; .

Строка формата fmt проверяется во время компиляции если она не инициализирована результатом вызова std::runtime_format (since C++26) . Если во время компиляции строка формата оказывается невалидной для типов форматируемых аргументов, будет выдана ошибка компиляции.

Следующие требования применяются к каждому типу T в Args , где CharT является char для перегрузок (1,3) , wchar_t для перегрузок (2,4) :

  • std:: formatter < T, CharT > должен удовлетворять требованиям BasicFormatter
  • std:: formatter < T, CharT > :: parse ( ) должен быть constexpr для целей проверки строки форматирования на этапе компиляции.

Содержание

Параметры

fmt - объект, представляющий строку формата. Строка формата состоит из
  • обычных символов (кроме { и } ), которые копируются в вывод без изменений,
  • escape-последовательностей { { и } } , которые заменяются на { и } соответственно в выводе, и
  • полей замены.

Каждое поле замены имеет следующий формат:

{ arg-id (optional) } (1)
{ arg-id (optional) : format-spec } (2)
1) поле замены без спецификации формата
2) поле замены со спецификацией формата
arg-id - указывает индекс аргумента в args , значение которого должно быть использовано для форматирования; если он опущен, аргументы используются по порядку.

Все arg-id  в строке формата должны быть либо все указаны, либо все опущены. Смешение ручной и автоматической индексации является ошибкой.

format-spec - спецификация формата, определяемая специализацией std::formatter для соответствующего аргумента. Не может начинаться с } .

(since C++23)
(since C++26)
  • Для других форматируемых типов спецификация формата определяется пользовательскими специализациями formatter .
args... - аргументы для форматирования
loc - std::locale используется для локале-специфичного форматирования

Возвращаемое значение

Строковый объект, содержащий отформатированный результат.

Исключения

Выбрасывает std::bad_alloc при ошибке выделения памяти. Также распространяет исключение, выброшенное любым форматтером.

Примечания

Не является ошибкой предоставить больше аргументов, чем требует строка формата:

std::format("{} {}!", "Hello", "world", "something"); // OK, возвращает "Hello world!"

Ошибкой является, если строка формата не является константным выражением если только она не инициализирована результатом std::runtime_format (начиная с C++26) . std::vformat не имеет этого требования.

std::string f1(std::string_view runtime_format_string)
{
    // return std::format(runtime_format_string, "x", 42); // ошибка
    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)
}

Пример

#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 += "{} "; // constructs the formatting string
        std::cout << fmt << " : ";
        std::cout << dyna_print(fmt, "alpha", 'Z', 3.14, "unused");
        std::cout << '\n';
    }
}

Возможный вывод:

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

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
P2216R3 C++20 throws std::format_error for invalid format string invalid format string results in compile-time error
P2418R2 C++20 objects that are neither const-usable nor copyable
(such as generator-like objects) are not formattable
allow formatting these objects
P2508R1 C++20 there's no user-visible name for this facility the name basic_format_string is exposed

Смотрите также

(C++20)
записывает форматированное представление своих аргументов через выходной итератор
(function template)
записывает форматированное представление своих аргументов через выходной итератор, не превышая указанный размер
(function template)