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)
  • Для других форматируемых типов спецификация формата определяется специализациями formatter пользователя.
args... - аргументы для форматирования
loc - std::locale используется для форматирования, учитывающего локаль

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

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

Исключения

Передает любое исключение, брошенное форматирующим объектом.

Пример

#include <format>
#include <iostream>
#include <vector>
#include <string_view>
 
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 { "₀"sv };  // { "\u2080"sv } => { 0xe2, 0x82, 0x80 };
    constexpr auto aprox_equ { "≅"sv }; // { "\u2245"sv } => { 0xe2, 0x89, 0x85 };
    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. Note: 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::string_view{buffer.data(), min_buffer_size} << "\"\n";
 
    // Or we can print the buffer directly by adding the trailing '\0'.
    buffer.push_back('\0');
    std::cout << "Buffer: \"" << 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/w/cpp/utility/format/formatted_size

Spec-Zone.ru

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