std::formatted_size
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <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 | — | объект, представляющий строку формата. Строка формата состоит из
Каждое поле замены имеет следующий формат:
1) поле замены без указания формата
2) поле замены со спецификацией формата
| ||||||||||||||||||||||||||||||||||||||||||
| 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 << '\n';
// Использовать std::vector в качестве динамического буфера.
// Примечание: буфер не содержит завершающего символа '\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 << "Буфер: \"" << std::string_view{buffer.data(), min_buffer_size} << "\"\n";
// Или мы можем распечатать буфер напрямую, добавив в конец '\0'.
buffer.push_back('\0');
std::cout << "Буфер: \"" << buffer.data() << "\"\n";
}
Вывод:
Минимальный размер буфера = 37
Буфер: "Hubble's H₀ ≅ *42* miles/sec/mpc."
Буфер: "Hubble's H₀ ≅ *42* miles/sec/mpc."
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| WG не указан | C++20 | генерирует std::format_error для неверной строки формата | неверная строка формата приводит к ошибке времени компиляции |
| WG не указан | C++20 | объекты, которые не являются ни константными, ни копируемыми (например, объекты, подобные генераторам), не форматируются |
форматирование этих объектов разрешено |
| WG не указан | C++20 | для этого средства нет видимого пользователем имени | представлено имя basic_format_string
|
Смотрите также
(C++20) |
записывает форматированное представление своих аргументов через итератор вывода (шаблон функции) |
(C++20) |
записывает форматированное представление своих аргументов через итератор вывода, не превышая заданного размера (шаблон функции) |