* *or*
* std::string alt_fmt_print(bool short_format) const
* as public member functions.
+ * *or*
+ * auto fmt_print_ctx(auto &ctx) -> decltype(ctx.out());
*/
template<class T>
concept has_fmt_print = requires(T t) {
concept has_alt_fmt_print = requires(T t) {
{ t.alt_fmt_print(bool{}) } -> std::same_as<std::string>;
};
+template<class T>
+concept has_fmt_print_ctx = requires(
+ T t, fmt::buffer_context<char> &ctx) {
+ { t.fmt_print_ctx(ctx) } -> std::same_as<decltype(ctx.out())>;
+};
namespace fmt {
bool verbose{true};
};
+template <has_fmt_print_ctx T>
+struct formatter<T> {
+ template <typename ParseContext>
+ constexpr auto parse(ParseContext& ctx) { return ctx.begin(); }
+ template <typename FormatContext>
+ auto format(const T& k, FormatContext& ctx) const {
+ return k.fmt_print_ctx(ctx);
+ }
+};
+
template <typename T>
struct formatter<std::optional<T>> {
constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }