This commit is contained in:
Björn Fahller 2017-07-17 10:41:10 +00:00 committed by GitHub
commit 36acb44f61
2 changed files with 33 additions and 3 deletions

View File

@ -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.
Note that this technique can be used for formatting class hierarchies too.::
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.

View File

@ -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 /*, typename T> */>
void format_arg(Formatter &, const Char *, const T &) { void format_arg(Formatter&, /* const char*& fmt_string, const T& t* */...) {
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.");