问题标签 [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.
c++ - 是否可以在vs2010中编译fmt
我知道 Visual Studio 2010 已经过时,不应该使用。我只是好奇是否可以在 vs2010 中编译 libfmt.a?
c++ - 如何连接格式字符串?
我想连接两个字符串并将它们用作fmt
库的格式字符串。显而易见的选择之一是将它们简单地连接为常规字符串,然后将它们传递到库中:
但是,c
将被丢弃。那么也许 fmt 提供了一种完全跳过它的方法?有没有办法在消息中放置一个字符串并告诉库它也应该被解析?就像是:
woud{:sf}
的意思是:放置一个字符串并将其用作格式。
c++ - 无法从 spdlog 中格式化参数
我正在尝试使用spdlog
. 我将它与我的代码合并,但现在我收到以下错误:
...这是错误消息的结尾。它永远不会到达我的代码,所以我不知道在哪里看。任何想法可能是什么原因?
spdlog 是 1.6.1 版。最后一个错误行来自这里:
在我看来并没有什么特别的错误。
更新:在注释掉所有spdlog
调用的一些尝试和错误之后,我将其缩小到:
spdlog::info("Foo{}", Point{1, 2});
Point
我自己的命名空间中我自己的类在哪里。我确实为它提供了一种打印自己的方法:
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_day
YYYY-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()
。
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!
问候,马丁
c++ - {fmt} 库:如何使用 RegEx 添加编译时字符串检查?
我正在使用{fmt}库。
不幸的是,几天后我的程序崩溃了,因为我的格式字符串无效。很容易修复 - 但如果还有更多呢?
可以对字符串格式进行编译时检查,这会发现此错误:
我可以在整个代码库中使用大约 500 个打印语句手动执行此操作。
但我想知道 - 有没有办法用正则表达式和 Visual Studio 中的查找/替换来做到这一点?
我尽可能使用.NET RegEx 测试器和一个字符串匹配:
然而,经过数小时的尝试,我仍然无法实现强大的搜索和替换。
2020 年 7 月 4 日更新。
使用我在下面的答案来解决问题。幸运的是,其余的都很完美。
c++ - spdlog 仅标头,带有外部 fmt。spdlog 错误:“内部”:不是“fmt”的成员
我使用仅标头 spdlog 作为 cmake 的外部项目。
为了将外部 fmt 库链接到 spdlog,添加了以下内容。
它在这种状态下执行。但是如果我添加以下代码以使用外部 fmt,则会发生编译错误。
错误信息如下。
我认为需要安装 spdlog 才能使用外部 fmt,而不是捆绑包,但我没有这样做。当我使用“ExternalProject_Add”安装 spdlog 时,我想我需要做一些额外的事情,但我不知道它是什么。
我在 spdlog/CMakeLists.txt 中找到了一个似乎与此相关的选项
我尝试了以下方法将“SPDLOG_FMT_EXTERNAL”更改为“ON”,但问题仍然存在。我不确定这是否是正确的方法和合适的解决方案。谢谢。
c++ - 是否可以从格式字符串中检索“宽度”
我需要一种从fmt::format
格式字符串中检索“宽度”参数的方法。
我不想要很容易提取的格式操作的结果大小auto size = fmt::formatted_size("{:>5.2f}", 13453453.76345f);
我期待这样的事情
而且......如果它也适用于整数,那就太好了:
c++ - 不能包含 std::format
我已经看到 std::format 有多么有用。但是每次我尝试将它包含在 C++20 中时它都不起作用。它显然已经包含在它的库中,但它没有出现,也没有在线信息。甚至 cppreference 也有它的示例,但它甚至不能在其在线编译器上运行。我附上了其中的一个片段。
你们中有人知道如何在没有从 GitHub 导入库的超级复杂的情况下使其工作。我主要在 VisualStudio 上工作。
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} 的目的。