Namespaces
Variants

std:: formatted_size

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

std:: size_t formatted_size ( const std:: locale & loc,

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

std:: size_t formatted_size ( const std:: locale & loc,

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

Определите общее количество символов в форматированной строке, форматируя args в соответствии с строкой формата fmt . Если присутствует, loc используется для локале-специфичного форматирования.

Поведение не определено, если std:: formatter < std:: remove_cvref_t < Ti > , CharT > не удовлетворяет требованиям BasicFormatter для любого Ti в Args .

Содержание

Параметры

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

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

{ arg-id (опционально) } (1)
{ arg-id (опционально) : 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 , используемая для локале-зависимого форматирования

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

Общее количество символов в форматированной строке.

Исключения

Распространяет любое исключение, выброшенное форматтером.

Пример

#include <format>
#include <iomanip>
#include <iostream>
#include <string_view>
#include <vector>
int main()
{
    using namespace std::literals::string_view_literals;
    constexpr auto fmt_str{"Hubble's H{0} {1} {2:*^4} miles/sec/mpc."sv};
    constexpr auto sub_zero{"\N{SUBSCRIPT ZERO}"sv}; // "₀" or {0342, 130, 128}
    constexpr auto aprox_equ{"\N{APPROXIMATELY EQUAL TO}"sv}; // "≅" or {0342, 137, 133}
    constexpr int Ho{42}; // H₀
    const auto min_buffer_size{std::formatted_size(fmt_str, sub_zero, aprox_equ, Ho)};
    std::cout << "Min buffer size = " << min_buffer_size << '\n';
    // Use std::vector as dynamic buffer. The buffer does not include the trailing '\0'.
    std::vector<char> buffer(min_buffer_size);
    std::format_to_n(buffer.data(), buffer.size(), fmt_str, sub_zero, aprox_equ, Ho);
    std::cout << "Buffer: "
              << std::quoted(std::string_view{buffer.data(), min_buffer_size})
              << '\n';
    // Print the buffer directly after adding the trailing '\0'.
    buffer.push_back('\0');
    std::cout << "Buffer: " << std::quoted(buffer.data()) << '\n';
}

Вывод:

Min buffer size = 37
Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc."
Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc."

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

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам 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)