diff --git a/README.md b/README.md index d3ab8b59..6a92fea2 100644 --- a/README.md +++ b/README.md @@ -269,21 +269,24 @@ void multi_sink_example2() --- #### User defined types ```c++ -// user defined types logging by implementing operator<< -#include "spdlog/fmt/ostr.h" // must be included -struct my_type +#ifdef SPDLOG_USE_STD_FORMAT +namespace std { +#else +namespace fmt { +#endif +template<> +struct formatter : formatter { - int i; - template - friend OStream &operator<<(OStream &os, const my_type &c) + auto format(my_type my, format_context &ctx) -> decltype(ctx.out()) { - return os << "[my_type i=" << c.i << "]"; + return format_to(ctx.out(), "[my_type i={}]", my.i); } }; +} void user_defined_example() { - spdlog::get("console")->info("user defined type: {}", my_type{14}); + spdlog::info("user defined type: {}", my_type(14)); } ``` diff --git a/example/example.cpp b/example/example.cpp index f7b4572b..ccfdcf2f 100644 --- a/example/example.cpp +++ b/example/example.cpp @@ -262,22 +262,26 @@ struct my_type : i(i){}; }; -// Using a namespace alias like fmt_lib is not allowed when extending an existing namespace, -// but the correct namespace can still be selected with the SPDLOG_USE_STD_FORMAT macro. -#ifdef SPDLOG_USE_STD_FORMAT -namespace std { -#else -namespace fmt { -#endif +#ifndef SPDLOG_USE_STD_FORMAT // when using fmtlib template<> -struct formatter : formatter +struct fmt::formatter : fmt::formatter { auto format(my_type my, format_context &ctx) -> decltype(ctx.out()) { return format_to(ctx.out(), "[my_type i={}]", my.i); } }; -} + +#else // when using std::format +template<> +struct std::formatter : std::formatter +{ + auto format(my_type my, format_context &ctx) -> decltype(ctx.out()) + { + return format_to(ctx.out(), "[my_type i={}]", my.i); + } +}; +#endif void user_defined_example() {