为自定义类型扩展 spdlog
Posted
技术标签:
【中文标题】为自定义类型扩展 spdlog【英文标题】:Extend spdlog for custom type 【发布时间】:2019-11-17 09:00:21 【问题描述】:在使用 格式化时,有没有办法扩展
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);
【问题讨论】:
全局名称_s
是保留的,请检查“C++ 中的保留标识符”。也就是说,是否有文档化的方式来扩展 spdlog?
【参考方案1】:
接受的答案不再适用于较新版本的 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
方法用于读取最终的格式规范,如果您不需要它们,您可以简单地返回 ctx.end()
并跳过示例中的规范。
【讨论】:
【参考方案2】:#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 中不再有效。看来您现在必须专门化格式化程序以上是关于为自定义类型扩展 spdlog的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在 Hive 中为自定义 Writable 类型编写自定义 ObjectInspector?