如何从 fmt::format_args 获取参数的命名列表

How to get named list of arguments from fmt::format_args

我正在尝试为 Logz.IO 构建 C++ 日志记录集成,它使用命名参数进行字符串插值,我想利用 fmt 进行参数解析和格式化。本质上,我正在尝试构建允许我传递命名参数的函数,例如

log_fmt("Length: {Length:.2f}", fmt::arg("Length", 125.5f));

我按照文档构建了模板化函数和我自己的日志记录函数:

  template <typename S, typename... Args>
  void log_fmt(const S& format, Args&&... args) {
    vlog(level, format,
         fmt::make_args_checked<Args...>(format, args...));
  }

  void vlog(fmt::string_view format, fmt::format_args args) {}

在我的 vlog 实现中,我想将 args 转换为 JSON 对象,它将包含所有参数(最好没有格式化部分):

{
    "Length": 125.5
}

但是看起来 format_args 只公开了非常基本的 public 接口(只允许 get。我如何遍历 args 并获取每个参数名称和值?

{fmt} 不提供 API 来迭代命名参数,但您可以在 log_fmt 中自行完成。每个命名参数都有 the following type:

template <typename Char, typename T> struct named_arg : view {
  const Char* name;
  const T& value;
  named_arg(const Char* n, const T& v) : name(n), value(v) {}
};