C++ fmt 库,仅使用格式说明符格式化单个参数

Posted

技术标签:

【中文标题】C++ fmt 库,仅使用格式说明符格式化单个参数【英文标题】:C++ fmt library, formatting a single argument with just format specifier 【发布时间】:2019-10-29 00:40:42 【问题描述】:

使用 C++ fmt 库,并给定一个裸格式说明符,有没有办法使用它来格式化单个参数?

// example
std::string str = magic_format(".2f", 1.23);

// current method
template <typename T>
std::string magic_format(const std::string spec, const T arg) 
    return fmt::format(fmt::format(":", spec), arg);

虽然上述实现符合我的要求,但我更喜欢一种不需要我在此过程中构建新的临时字符串的方式。

【问题讨论】:

【参考方案1】:

您可以直接使用formatter&lt;T&gt; 来做到这一点:


template <typename T>
std::string magic_format(fmt::string_view spec, const T& arg) 
  fmt::formatter<T> f;
  fmt::format_parse_context parse_ctx(spec);
  f.parse(parse_ctx);
  std::string str;
  auto out = std::back_inserter(str);
  using context = fmt::format_context_t<decltype(out), char>;
  auto args = fmt::make_format_args<context>(arg);
  context format_ctx(out, args, );
  f.format(arg, format_ctx);
  return str;

天箭:https://godbolt.org/z/Ras_QI

【讨论】:

以上是关于C++ fmt 库,仅使用格式说明符格式化单个参数的主要内容,如果未能解决你的问题,请参考以下文章

C++ fmt 格式动态重复参数

Go 语言fmt 标准库格式化输出说明

Go 语言fmt 标准库格式化输出说明

C++ Primer 5th笔记(chap 17 标准库特殊设施)regex_replace

使用 fmt 库格式化用户定义类型的问题

C++ fmt::print 与 fmt::format_to 命名的技术背景?