...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
A type T
is Formattable
if it can be passed as a format
argument to SQL formatting functions, like format_sql
.
Formally, let T
be any type,
and U
the result of stripping
cv-qualifiers and references from T
.
T
satisfies Formattable
if any of the following are
true:
U
satisfies WritableField
.
This includes scalar types and optionals.
formatter
has been specialized for U
.
T
is a formattable range,
or a reference to one. Formally, given a variable t
of type T
(that might
be a reference), T
is
a formattable range if:
std::begin(t)
and std::end(t)
return an iterator/sentinel pair that can be compared for (in)equality.
std::decay_t<decltype(*std::begin(t))>
is a WritableField
or has a specialized formatter. In other words, the range's element
type must be either an elemental type or have a custom formatted
defined, but must not be a range.
U
does not satisfy
WritableField
(i.e. vector<unsigned char>
is formatted as a blob, not
as a sequence).
U
is formattable_ref
.
For a reference table on built-in formattable types, see this section.