问题标签 [fmt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
101 浏览

c++ - 是否可以在vs2010中编译fmt

我知道 Visual Studio 2010 已经过时,不应该使用。我只是好奇是否可以在 vs2010 中编译 libfmt.a?

0 投票
1 回答
330 浏览

c++ - 如何连接格式字符串?

我想连接两个字符串并将它们用作fmt库的格式字符串。显而易见的选择之一是将它们简单地连接为常规字符串,然后将它们传递到库中:

但是,c将被丢弃。那么也许 fmt 提供了一种完全跳过它的方法?有没有办法在消息中放置一个字符串并告诉库它也应该被解析?就像是:

woud{:sf}的意思是:放置一个字符串并将其用作格式。

0 投票
1 回答
2336 浏览

c++ - 无法从 spdlog 中格式化参数

我正在尝试使用spdlog. 我将它与我的代码合并,但现在我收到以下错误:

...这是错误消息的结尾。它永远不会到达我的代码,所以我不知道在哪里看。任何想法可能是什么原因?

spdlog 是 1.6.1 版。最后一个错误行来自这里:

在我看来并没有什么特别的错误。


更新:在注释掉所有spdlog调用的一些尝试和错误之后,我将其缩小到:

spdlog::info("Foo{}", Point{1, 2});

Point我自己的命名空间中我自己的类在哪里。我确实为它提供了一种打印自己的方法:

0 投票
1 回答
532 浏览

c++ - fmt with Howard Hinnant 的日期:为什么来自 fmt::to_string 的“{}”?fmt 和日期的最佳实践?

TL;DR:我正在为fmt和 Howard Hinnant 的日期库实现自定义格式化程序。有了date::year_month_day d{};,为什么fmt::to_string(d)return "{}"whilefmt::format("{}", d)工作正常,返回"0000-00-00"Godbolt 上的示例


我正在使用日期库并尝试从 iostreams 切换到fmt。我需要以date::year_month_dayYYYY-MM-DD 格式进行格式化,所以我编写了一个自定义格式化程序(fmt::formatter for 的模板专业化date::year_month_day):

Godbolt 上提供了完整的最小工作示例,其中包含两个工作示例和一个失败示例。

使用该自定义格式化程序,fmt::format("{}", date::year_month_day{})按预期工作,返回"0000-00-00". fmt::to_string(date::year_month_day{})应该返回相同的结果,但返回"{}"

date::year_month_day格式化和其他类型date的最佳方式是什么fmt,包括fmt::to_string()?为什么我会这样"{}"

我还不能使用支持 C++20 日期的编译器:据我所知,截至 2020 年 6 月,C++20 的 std::chrono 的日历和时区部分还没有完整的实现。

更新:对自定义空结构使用自定义格式化程序可以正常工作,对 and 给出相同的结果format("{}", s)to_string(s)请参见上面的 Godbolt 链接上的示例。date::year_month_day所以肯定有什么特别之处fmt::to_string()

0 投票
1 回答
339 浏览

c++ - 在 C++ {fmt} 中格式化普通结构的扩展计划?

在我当前的项目中,我需要一个自定义的非常简单的“序列化”表示几个琐碎的数据传输对象 (DTO) 结构。在第一次想出一个定制的解决方案之后,那是一个大的 PITA,我有使用 {fmt} 的想法。

所以最近几天我正在通过fmt::formatter模板专业化机制的扩展来处理自定义类型的格式。因此,此博客您的文档非常有帮助。

经过一番折腾,我想出了一个非常通用的 poc 解决方案,它允许以多种自定义格式格式化结构,看起来有点像下面这样:

显然,没有标准的方法来反映结构的字段和名称,因此必须手动提供反射结构,或者例如通过宏魔术。但这是一个不同的话题,我不想在这里讨论。- 如果我们幸运的话,我们会在 c++23 \o/ 中得到一些最小的编译时间反射。让我们希望!

我把所有这些放在了这个 repo中。

实际问题:

通过 {fmt} 提供的简单反射 API 格式化用户定义的类型是您认为未来可能对 {fmt} 进行扩展的东西吗?我想象一个场景,其中预定义了几个简单的格式化模式,用户只需要为他的类型提供反射。

有了这个,我什至可以看到像fmt::format("{:json,prety,tabwith=4}", outer)在地平线上的格式化表达式。

另外,也许我只是在重新发明轮子,所以如果有类似的东西,基于 {fmt} 那里 - 告诉我!:)

无论如何,感谢您为社区提供了很棒的工具,并祝贺您将其变成了 c++20!

问候,马丁

0 投票
2 回答
271 浏览

c++ - {fmt} 库:如何使用 RegEx 添加编译时字符串检查?

我正在使用{fmt}库。

不幸的是,几天后我的程序崩溃了,因为我的格式字符串无效。很容易修复 - 但如果还有更多呢?

可以对字符串格式进行编译时检查,这会发现此错误:

我可以在整个代码库中使用大约 500 个打印语句手动执行此操作。

但我想知道 - 有没有办法用正则表达式和 Visual Studio 中的查找/替换来做到这一点?

我尽可能使用.NET RegEx 测试器和一个字符串匹配:

然而,经过数小时的尝试,我仍然无法实现强大的搜索和替换。


2020 年 7 月 4 日更新。

使用我在下面的答案来解决问题。幸运的是,其余的都很完美。

0 投票
1 回答
2136 浏览

c++ - spdlog 仅标头,带有外部 fmt。spdlog 错误:“内部”:不是“fmt”的成员

我使用仅标头 spdlog 作为 cmake 的外部项目。

为了将外部 fmt 库链接到 spdlog,添加了以下内容。

它在这种状态下执行。但是如果我添加以下代码以使用外部 fmt,则会发生编译错误。

错误信息如下。

我认为需要安装 spdlog 才能使用外部 fmt,而不是捆绑包,但我没有这样做。当我使用“ExternalProject_Add”安装 spdlog 时,我想我需要做一些额外的事情,但我不知道它是什么。

我在 spdlog/CMakeLists.txt 中找到了一个似乎与此相关的选项

我尝试了以下方法将“SPDLOG_FMT_EXTERNAL”更改为“ON”,但问题仍然存在。我不确定这是否是正确的方法和合适的解决方案。谢谢。

0 投票
1 回答
105 浏览

c++ - 是否可以从格式字符串中检索“宽度”

我需要一种从fmt::format格式字符串中检索“宽度”参数的方法。

不想要很容易提取的格式操作的结果大小auto size = fmt::formatted_size("{:>5.2f}", 13453453.76345f);

我期待这样的事情

而且......如果它也适用于整数,那就太好了:

0 投票
1 回答
2222 浏览

c++ - 不能包含 std::format

我已经看到 std::format 有多么有用。但是每次我尝试将它包含在 C++20 中时它都不起作用。它显然已经包含在它的库中,但它没有出现,也没有在线信息。甚至 cppreference 也有它的示例,但它甚至不能在其在线编译器上运行。我附上了其中的一个片段。

你们中有人知道如何在没有从 GitHub 导入库的超级复杂的情况下使其工作。我主要在 VisualStudio 上工作。

0 投票
1 回答
259 浏览

c++ - 带有外部模板的自定义类型 {fmt} 格式化程序,有什么缺点吗?

我有一个标题,它为我的自定义类型定义了所有 {fmt} 格式化程序。

为了缩短编译时间,我想减少这个自定义格式化程序头的依赖关系,并决定将所有格式化程序定义为外部模板,其中实现放在 a.cpp中,头文件中的声明如下:

...以及.cpp文件中的定义:

主要优点是头文件变得不那么繁重,所有自定义类型都可以前向声明,并且我不再包含世界,以防我想在某个翻译单元中自定义单一类型的格式。

但是,大多数使用 {fmt} 实现自定义格式化程序的示例将format()函数定义为模板化format_context类型的模板函数:

这实际上不适用于外部模板,因为我需要预先声明format()所有可能的类型FormatContext。这很容易出错。目前,只有使用fmt::format_context作品和编译器会告诉我什么时候它不再足够了。

我想知道由于没有在FormatContext类型上模板化格式函数而失去了什么?在什么情况下是fmt::format_context不够的?有没有更好的方法来定义这些自定义类型格式化程序,而不必将完整的实现放在头文件中?我正在考虑走这std::ostream条路,然后简单地包括<fmt/ostream.h>每当我想用 {fmt} 格式化我的类型时,但它首先部分地违背了使用 {fmt} 的目的。