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(conststd::locale& loc, | (3) | (начиная с C++20) |
template<class... Args> std::size_t formatted_size(conststd::locale& loc, | (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(){usingnamespace std::literals::string_view_literals; constexprauto fmt_str {"Hubble's H{0} {1} {2:*^4} miles/sec/mpc."sv };constexprauto sub_zero {"₀"sv };// { "\u2080"sv } => { 0xe2, 0x82, 0x80 };constexprauto aprox_equ {"≅"sv };// { "\u2245"sv } => { 0xe2, 0x89, 0x85 };constexprint Ho {42};// H₀ constauto 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) | записывает форматированное представление своих аргументов через итератор вывода, не превышая заданного размера (шаблон функции) |