为自定义类型扩展 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 中不再有效。看来您现在必须专门化格式化程序(在fmt.dev/latest/api.html#format-api 之后)。

以上是关于为自定义类型扩展 spdlog的主要内容,如果未能解决你的问题,请参考以下文章

将表转换为自定义类型数组

我们如何在 Hive 中为自定义 Writable 类型编写自定义 ObjectInspector?

C#中string类型转换为自定义数据类型怎么转?

R语言将连续数值转换为自定义间隔的离散类型数据(分类型标称型)实战: 自定义间隔的数据分箱

为自定义帖子类型创建存档:wordpress

在 Wordpress 中为自定义帖子类型添加附加页面