为自定义类型扩展 spdlog
Extend spdlog for custom type
有没有办法扩展 spdlog
以在使用 {}
格式化时支持自定义结构作为项目?
所以当我有一个
struct p {
int x;
int y;
int z;
};
p my_p;
我想做
spdlog::info("p = {}", my_p);
// after registering some kind of formatter object for {p}
而不是
spdlog::info("p = (x={}, y={}, z={})", my_p.x, my_p.y, my_p.z);
#include "spdlog/spdlog.h"
#include "spdlog/fmt/ostr.h" // must be included
class some_class {};
std::ostream& operator<<(std::ostream& os, const some_class& c)
{
return os << "some_class";
}
见https://github.com/gabime/spdlog/wiki/1.-QuickStart#log-user-defined-objects
已接受的答案不再适用于较新版本的 spdlog,fmt
现在需要专门化 formatter<T>
(有关详细信息,请参阅 https://fmt.dev/latest/api.html#udt)。
使用您的 p
结构,这是格式化程序:
#include <spdlog/fmt/bundled/format.h>
template<>
struct fmt::formatter<p> {
constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {
return ctx.end();
}
template <typename FormatContext>
auto format(const p& input, FormatContext& ctx) -> decltype(ctx.out()) {
return format_to(ctx.out(),
"(x={}, y={}, z={})",
p.x, p.y, p.z);
}
};
parse
方法用于读取最终的格式规范,如果您不需要它们,您可以简单地 return ctx.end()
并跳过示例中的规范。
有没有办法扩展 spdlog
以在使用 {}
格式化时支持自定义结构作为项目?
所以当我有一个
struct p {
int x;
int y;
int z;
};
p my_p;
我想做
spdlog::info("p = {}", my_p);
// after registering some kind of formatter object for {p}
而不是
spdlog::info("p = (x={}, y={}, z={})", my_p.x, my_p.y, my_p.z);
#include "spdlog/spdlog.h"
#include "spdlog/fmt/ostr.h" // must be included
class some_class {};
std::ostream& operator<<(std::ostream& os, const some_class& c)
{
return os << "some_class";
}
见https://github.com/gabime/spdlog/wiki/1.-QuickStart#log-user-defined-objects
已接受的答案不再适用于较新版本的 spdlog,fmt
现在需要专门化 formatter<T>
(有关详细信息,请参阅 https://fmt.dev/latest/api.html#udt)。
使用您的 p
结构,这是格式化程序:
#include <spdlog/fmt/bundled/format.h>
template<>
struct fmt::formatter<p> {
constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {
return ctx.end();
}
template <typename FormatContext>
auto format(const p& input, FormatContext& ctx) -> decltype(ctx.out()) {
return format_to(ctx.out(),
"(x={}, y={}, z={})",
p.x, p.y, p.z);
}
};
parse
方法用于读取最终的格式规范,如果您不需要它们,您可以简单地 return ctx.end()
并跳过示例中的规范。