std::formatter
| Defined in header <format>
|
||
template< class T, class CharT = char > struct formatter; |
(since C++20) | |
The enabled specializations of std::formatter define formatting rules for a given type. Enabled specializations meet the BasicFormatter requirements, and, unless otherwise specified, also meet the Formatter requirements.
For all types T and CharT for which no specialization std::formatter<T, CharT> is enabled, that specialization is a complete type and is disabled.
Disabled specializations do not meet the Formatter requirements, and the following are all 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.
Basic standard specializations
In the following list, CharT is either char or wchar_t, ArithmeticT is any cv-unqualified arithmetic type other than char, wchar_t, char8_t, char16_t, or char32_t:
| Character formatters |
||
template<> struct formatter<char, char>; |
(1) | |
template<> struct formatter<char, wchar_t>; |
(2) | |
template<> struct formatter<wchar_t, wchar_t>; |
(3) | |
| String formatters |
||
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) | |
| Arithmetic formatters |
||
template<> struct formatter<ArithmeticT, CharT>; |
(9) | |
| Pointer formatters |
||
template<> struct formatter<std::nullptr_t, CharT>; |
(10) | |
template<> struct formatter<void*, CharT>; |
(11) | |
template<> struct formatter<const void*, CharT>; |
(12) | |
Formatters for other pointers and pointers to members are disabled.
Specializations such as std::formatter<wchar_t, char> and std::formatter<const char*, wchar_t> that would require encoding conversions are disabled.
|
The following specialization are still disabled in C++23 to avoid formatting some
A debug-enabled formatter specialization additionally provides a public non-static member function Each formatter specialization for string or character type is debug-enabled. |
(since C++23) |
Standard format specification
| This section is incomplete Reason: The standard format specification is moved to a separate page. The section title is temporarily preserved for links to this section. This section will be removed after all those links are settled. |
Standard specializations for library types
formatting support for duration (class template specialization) | |
formatting support for sys_time (class template specialization) | |
formatting support for utc_time (class template specialization) | |
formatting support for tai_time (class template specialization) | |
formatting support for gps_time (class template specialization) | |
formatting support for file_time (class template specialization) | |
formatting support for local_time (class template specialization) | |
formatting support for day (class template specialization) | |
formatting support for month (class template specialization) | |
formatting support for year (class template specialization) | |
formatting support for weekday (class template specialization) | |
formatting support for weekday_indexed (class template specialization) | |
formatting support for weekday_last (class template specialization) | |
formatting support for month_day (class template specialization) | |
formatting support for month_day_last (class template specialization) | |
formatting support for month_weekday (class template specialization) | |
formatting support for month_weekday_last (class template specialization) | |
formatting support for year_month (class template specialization) | |
formatting support for year_month_day (class template specialization) | |
formatting support for year_month_day_last (class template specialization) | |
formatting support for year_month_weekday (class template specialization) | |
formatting support for year_month_weekday_last (class template specialization) | |
formatting support for hh_mm_ss (class template specialization) | |
formatting support for sys_info (class template specialization) | |
formatting support for local_info (class template specialization) | |
formatting support for zoned_time (class template specialization) | |
formatting support for basic_stacktrace (class template specialization) | |
formatting support for stacktrace_entry (class template specialization) | |
formatting support for thread::id (class template specialization) | |
formatting support for vector<bool>::reference (class template specialization) | |
formatting support for pair and tuple (class template specialization) | |
(C++23) |
formatting support for ranges (class template specialization) |
(C++23) |
formatting support for std::stack (class template specialization) |
(C++23) |
formatting support for std::queue (class template specialization) |
formatting support for std::priority_queue (class template specialization) | |
formatting support for filesystem::path (class template specialization) |
Example
#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);
}
Output:
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".
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3944 | C++23 | some char sequences were formattable as ranges of wchar_t
|
disable specializations added |
See also
(C++20)(C++20)(C++20) |
formatting state, including all formatting arguments and the output iterator (class template) |
(C++23) |
specifies that a type is formattable, that is, it specializes std::formatter and provides member functions parse and format (concept) |
(C++23) |
class template that helps implementing std::formatter specializations for range types (class template) |