【问题标题】:fmt::dynamic_format_arg_store replacement/implementation for std::formatfmt::dynamic_format_arg_store 替换/实现 std::format
【发布时间】:2021-12-19 18:24:20
【问题描述】:

看起来 c++20 std::format 不是 fmt 库的直接替代品。

查看 API (https://en.cppreference.com/w/cpp/utility/format),fmt::dynamic_format_arg_store 似乎不是标准的一部分。

目前在 fmt 中可以有如下代码:

#include <fmt/format.h>
#include <fmt/args.h>

int main() 
{
  auto store = fmt::dynamic_format_arg_store<fmt::format_context>();
  store.push_back(42);
  store.push_back( std::string { "abc1"} );
  store.push_back(1.5f);
  fmt::vprint("{} this is my {}. This is a number: {}.", store);
}

我想将 fmt 替换为标准的 std::format

我快速浏览了fmt::dynamic_format_arg_store,它似乎使用了 fmt 的一些内部东西,所以看起来并不那么直接。

任何人都可以提供一些指导,说明如何使用std::format 在 fmt for C++20 之外实现上述功能?

编辑:

fmt:dynamic_format_arg_store 中查看更深一点,它看起来像是在使用detail:make_arg 来创建一个参数。

我不知道如何从 std::format 获得等效的东西,因为我只看到 std::make_format_args 返回不同的类型。

是否可以为std:format 实现fmt:dynamic_format_arg_store 而无需了解每个编译器的具体实现细节?

【问题讨论】:

  • 它是否必须是“动态的”?不能不使用make_format_args,传递静态参数序列吗?
  • 恐怕它必须是动态的..我有一个后台线程弹出/反序列化格式字符串和n队列中的参数数量,然后将它们存储到fmt: dynamic_format_arg_store,然后被格式化

标签: c++ std c++20 fmt


【解决方案1】:

您不能自己为std::format 实现等价的fmt::dynamic_format_arg_store,因为std::basic_format_args 的表示是标准库的实现细节。它可能会在 C++ 标准的未来版本之一中提供。

【讨论】:

  • 感谢@vitaut 的回答。我昨天通过在具有std::format 的 MSVC 中尝试一下也意识到了这一点。这看起来像是标准库的一个很大限制:( 一个简单的实现是将fmt::internal::make_arg&lt;ctx&gt;(arg) 存储到 fmt_args 向量,然后使用构造函数fmt::basic_format_args&lt;ctx&gt;(fmt_args.data(), fmt_args.size()))。但是例如,MSVC 中缺少这些东西,因为它们没有标准化。如果标准提供,std::make_format_arg 和上述构造函数就足够了。
猜你喜欢
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 2021-06-05
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多