C ++ fmt библиотека, форматирование одного аргумента с помощью только спецификатора формата - PullRequest
1 голос
/ 29 октября 2019

Используя библиотеку fmt C ++ и учитывая пустой спецификатор формата, есть ли способ отформатировать один аргумент, используя его?

// 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 Ответ

2 голосов
/ 29 октября 2019

Вы можете сделать это, используя formatter<T> напрямую:


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

...