std:: formatter
|
Определено в заголовке
<format>
|
||
|
template
<
class
T,
class
CharT
=
char
>
struct formatter ; |
(начиная с C++20) | |
Включенные специализации
std::formatter
определяют правила форматирования для заданного типа. Включенные специализации удовлетворяют требованиям
BasicFormatter
и, если не указано иное, также удовлетворяют требованиям
Formatter
.
Для всех типов
T
и
CharT
, для которых не включена специализация
std::formatter<T, CharT>
, эта специализация является полным типом и отключена.
Отключенные специализации не удовлетворяют Formatter требованиям, и следующие выражения являются false :
- std::is_default_constructible_v
- std::is_copy_constructible_v
- std::is_move_constructible_v
- std::is_copy_assignable_v
- std::is_move_assignable_v .
Содержание |
Базовые стандартные специализации
В следующем списке
CharT
обозначает либо
char
, либо
wchar_t
,
ArithmeticT
представляет любой cv-неквалифицированный арифметический тип, кроме
char
,
wchar_t
,
char8_t
,
char16_t
или
char32_t
:
|
Форматтеры для символов
|
||
|
template
<>
struct formatter < char , char > ; |
(1) | |
|
template
<>
struct formatter < char , wchar_t > ; |
(2) | |
|
template
<>
struct formatter < wchar_t , wchar_t > ; |
(3) | |
|
Форматтеры для строк
|
||
|
template
<>
struct formatter < CharT * , CharT > ; |
(4) | |
|
template
<>
struct formatter < const CharT * , CharT > ; |
(5) | |
|
template
<
std::
size_t
N
>
struct formatter < CharT [ N ] , CharT > ; |
(6) | |
|
template
<
class
Traits,
class
Alloc
>
struct formatter < std:: basic_string < CharT, Traits, Alloc > , CharT > ; |
(7) | |
|
template
<
class
Traits
>
struct formatter < std:: basic_string_view < CharT, Traits > , CharT > ; |
(8) | |
|
Форматтеры для арифметических типов
|
||
|
template
<>
struct formatter < ArithmeticT, CharT > ; |
(9) | |
|
Форматтеры для указателей
|
||
|
template
<>
struct formatter < std:: nullptr_t , CharT > ; |
(10) | |
|
template
<>
struct formatter < void * , CharT > ; |
(11) | |
|
template
<>
struct formatter < const void * , CharT > ; |
(12) | |
Форматтеры для других указателей и указателей на члены отключены.
Специализации, такие как std :: formatter < wchar_t , char > и std :: formatter < const char * , wchar_t > , которые потребовали бы преобразований кодировок, отключены.
|
Следующие специализации всё ещё отключены в C++23, чтобы избежать форматирования некоторых char последовательностей как диапазонов wchar_t :
Специализация форматтера с
включённой отладкой
дополнительно предоставляет открытую нестатическую функцию-член
constexpr
void
set_debug_format
(
)
;
которая изменяет состояние объекта форматтера так, что он будет форматировать значения как
экранированные и в кавычках
, как если бы
тип
спецификатора формата, разобранный последним вызовом
Каждая специализация форматтера для строкового или символьного типа является debug-enabled . |
(начиная с C++23) |
Стандартная спецификация формата
|
Этот раздел неполный
Причина: Спецификация стандартного формата перемещена на отдельную страницу . Заголовок раздела временно сохранён для ссылок на этот раздел. Этот раздел будет удалён после того, как все эти ссылки будут обработаны. |
Стандартные специализации для библиотечных типов
поддержка форматирования для
duration
(специализация шаблона класса) |
|
поддержка форматирования для
sys_time
(специализация шаблона класса) |
|
поддержка форматирования для
utc_time
(специализация шаблона класса) |
|
поддержка форматирования для
tai_time
(специализация шаблона класса) |
|
поддержка форматирования для
gps_time
(специализация шаблона класса) |
|
поддержка форматирования для
file_time
(специализация шаблона класса) |
|
поддержка форматирования для
local_time
(специализация шаблона класса) |
|
поддержка форматирования для
day
(специализация шаблона класса) |
|
поддержка форматирования для
month
(специализация шаблона класса) |
|
поддержка форматирования для
year
(специализация шаблона класса) |
|
поддержка форматирования для
weekday
(специализация шаблона класса) |
|
поддержка форматирования для
weekday_indexed
(специализация шаблона класса) |
|
поддержка форматирования для
weekday_last
(специализация шаблона класса) |
|
поддержка форматирования для
month_day
(специализация шаблона класса) |
|
поддержка форматирования для
month_day_last
(специализация шаблона класса) |
|
поддержка форматирования для
month_weekday
(специализация шаблона класса) |
|
поддержка форматирования для
month_weekday_last
(специализация шаблона класса) |
|
поддержка форматирования для
year_month
(специализация шаблона класса) |
|
поддержка форматирования для
year_month_day
(специализация шаблона класса) |
|
поддержка форматирования для
year_month_day_last
(специализация шаблона класса) |
|
поддержка форматирования для
year_month_weekday
(специализация шаблона класса) |
|
поддержка форматирования для
year_month_weekday_last
(специализация шаблона класса) |
|
поддержка форматирования для
hh_mm_ss
(специализация шаблона класса) |
|
поддержка форматирования для
sys_info
(специализация шаблона класса) |
|
поддержка форматирования для
local_info
(специализация шаблона класса) |
|
поддержка форматирования для
zoned_time
(специализация шаблона класса) |
|
поддержка форматирования для
basic_stacktrace
(специализация шаблона класса) |
|
поддержка форматирования для
stacktrace_entry
(специализация шаблона класса) |
|
|
(C++23)
|
поддержка форматирования для
thread::id
(специализация шаблона класса) |
поддержка форматирования для
vector<bool>::reference
(специализация шаблона класса) |
|
|
(C++23)
|
поддержка форматирования для
pair
и
tuple
(специализация шаблона класса) |
|
(C++23)
|
поддержка форматирования для диапазонов
(специализация шаблона класса) |
|
(C++23)
|
поддержка форматирования для
std::stack
(специализация шаблона класса) |
|
(C++23)
|
поддержка форматирования для
std::queue
(специализация шаблона класса) |
поддержка форматирования для
std::priority_queue
(специализация шаблона класса) |
|
поддержка форматирования для
filesystem::path
(специализация шаблона класса) |
Пример
#include <algorithm> #include <format> #include <iomanip> #include <iostream> #include <sstream> #include <string_view> struct QuotableString : std::string_view {}; template<> struct std::formatter<QuotableString, char> { bool quoted = false; template<class ParseContext> constexpr ParseContext::iterator parse(ParseContext& ctx) { auto it = ctx.begin(); if (it == ctx.end()) return it; if (*it == '#') { quoted = true; ++it; } if (it != ctx.end() && *it != '}') throw std::format_error("Invalid format args for QuotableString."); return it; } template<class FmtContext> FmtContext::iterator format(QuotableString s, FmtContext& ctx) const { std::ostringstream out; if (quoted) out << std::quoted(s); else out << s; return std::ranges::copy(std::move(out).str(), ctx.out()).out; } }; int main() { QuotableString a("be"), a2(R"( " be " )"); QuotableString b("a question"); std::cout << std::format("To {0} or not to {0}, that is {1}.\n", a, b); std::cout << std::format("To {0:} or not to {0:}, that is {1:}.\n", a, b); std::cout << std::format("To {0:#} or not to {0:#}, that is {1:#}.\n", a2, b); }
Вывод:
To be or not to be, that is a question. To be or not to be, that is a question. To " \" be \" " or not to " \" be \" ", that is "a question".
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3944 | C++23 | некоторые последовательности char форматировались как диапазоны wchar_t | добавленные специализации отключены |
Смотрите также
|
(C++20)
(C++20)
(C++20)
|
состояние форматирования, включая все аргументы форматирования и выходной итератор
(шаблон класса) |
|
(C++23)
|
указывает, что тип является форматируемым, то есть специализирует
std::formatter
и предоставляет функции-члены
parse
и
format
(концепт) |
|
(C++23)
|
шаблон класса, который помогает реализовывать
std::formatter
специализации для типов диапазонов
(шаблон класса) |