mirror of
https://github.com/fmtlib/fmt.git
synced 2025-08-01 03:34:45 +02:00
Make format_arg() accept class hierarchies
If a base class can be formatted, it is assumed that the hierarchy can be formatted from the base class. The idiom is not uncommon with ostreams.
This commit is contained in:
committed by
Victor Zverovich
parent
ca0e38304c
commit
9c56a8ce5c
30
doc/api.rst
30
doc/api.rst
@@ -84,6 +84,36 @@ Note in the example above the ``format_arg`` function ignores the contents of
|
|||||||
``format_arg`` in :file:`fmt/time.h` for an advanced example of how to use
|
``format_arg`` in :file:`fmt/time.h` for an advanced example of how to use
|
||||||
the ``format_str`` argument to customize the formatted output.
|
the ``format_str`` argument to customize the formatted output.
|
||||||
|
|
||||||
|
This technique can also be used for formatting class hierarchies::
|
||||||
|
|
||||||
|
namespace local {
|
||||||
|
struct Parent {
|
||||||
|
Parent(int p) : p(p) {}
|
||||||
|
virtual void write(fmt::Writer &w) const {
|
||||||
|
w.write("Parent : p={}", p);
|
||||||
|
}
|
||||||
|
int p;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Child : Parent {
|
||||||
|
Child(int c, int p) : Parent(p), c(c) {}
|
||||||
|
virtual void write(fmt::Writer &w) const {
|
||||||
|
w.write("Child c={} : ", c);
|
||||||
|
Parent::write(w);
|
||||||
|
}
|
||||||
|
int c;
|
||||||
|
};
|
||||||
|
|
||||||
|
void format_arg(fmt::BasicFormatter<char> &f,
|
||||||
|
const char *&format_str, const Parent &p) {
|
||||||
|
p.write(f.writer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Local::Child c(1,2);
|
||||||
|
Local::Parent &p = c;
|
||||||
|
fmt::print("via ref to base: {}\n", p);
|
||||||
|
fmt::print("direct to child: {}\n", c);
|
||||||
|
|
||||||
This section shows how to define a custom format function for a user-defined
|
This section shows how to define a custom format function for a user-defined
|
||||||
type. The next section describes how to get ``fmt`` to use a conventional stream
|
type. The next section describes how to get ``fmt`` to use a conventional stream
|
||||||
output ``operator<<`` when one is defined for a user-defined type.
|
output ``operator<<`` when one is defined for a user-defined type.
|
||||||
|
@@ -1255,9 +1255,9 @@ inline fmt::StringRef thousands_sep(...) { return ""; }
|
|||||||
typedef int FMT_CONCAT_(Assert, __LINE__)[(cond) ? 1 : -1] FMT_UNUSED
|
typedef int FMT_CONCAT_(Assert, __LINE__)[(cond) ? 1 : -1] FMT_UNUSED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
template <typename Formatter, typename Char, typename T>
|
template <typename Formatter>
|
||||||
void format_arg(Formatter &, const Char *, const T &) {
|
void format_arg(Formatter&, ...) {
|
||||||
FMT_STATIC_ASSERT(FalseType<T>::value,
|
FMT_STATIC_ASSERT(FalseType<Formatter>::value,
|
||||||
"Cannot format argument. To enable the use of ostream "
|
"Cannot format argument. To enable the use of ostream "
|
||||||
"operator<< include fmt/ostream.h. Otherwise provide "
|
"operator<< include fmt/ostream.h. Otherwise provide "
|
||||||
"an overload of format_arg.");
|
"an overload of format_arg.");
|
||||||
|
Reference in New Issue
Block a user