Spec-Zone.ru › C++

std::formatted_size

Определено в заголовочном файле <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 - объект, представляющий строку формата. Строка формата состоит из
  • обычных символов (кроме { и }), которые без изменений копируются в выходные данные,
  • управляющих последовательностей {{ и }}, которые заменяются соответственно на { и } в выходных данных, и
  • полей подстановки.

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

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

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

format-spec - спецификация формата, определённая специализацией std::formatter для соответствующего аргумента. Не может начинаться с }.
  • Для базовых типов и стандартных строковых типов спецификация формата интерпретируется как стандартная спецификация формата.
  • Для типов chrono спецификация формата интерпретируется как спецификация формата chrono.
  • Для типов-диапазонов спецификация формата интерпретируется как спецификация формата диапазона.
  • Для std::pair и std::tuple спецификация формата интерпретируется как спецификация формата кортежа.
  • Для std::thread::id и std::stacktrace_entry см. спецификацию формата идентификатора потока и спецификацию формата элемента трассировки стека.
  • Для std::basic_stacktrace спецификатор формата не допускается.
(начиная с C++23)
  • Для std::filesystem::path см. спецификацию формата пути.
(начиная с 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 Применён к Поведение согласно опубликованной версии Правильное поведение
P2216R3 C++20 выбрасывается std::format_error при недопустимой строке формата недопустимая строка формата приводит к ошибке времени компиляции
P2418R2 C++20 объекты, которые нельзя использовать как const или копировать
(например, объекты, подобные генераторам), нельзя форматировать
разрешить форматирование этих объектов
P2508R1 C++20 у этой возможности нет общедоступного имени имя basic_format_string стало доступно

См. также

format_to
(C++20)
записывает форматированное представление аргументов с помощью выходного итератора
(шаблон функции)
format_to_n
(C++20)
записывает форматированное представление аргументов с помощью выходного итератора, не превышая заданный размер
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/format/formatted_size

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API