问题标签 [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 投票
0 回答
399 浏览

c++ - 由于#if,Visual Studio Code 智能感知无法识别部分头文件

我对 c++ 的Visual Studio 代码fmt库有疑问。我让库工作,但我的智能感知在编写时没有显示/填充fmt/os.h标头的函数,原因是 os.h 标头中的这些行

我使用win10和mingw g++,底部是我的tasks.json

因此 #define FMT_USE_FCNTL 0 导致智能感知无法识别部分标题(它在第 149 行“注释”掉部分标题)。我是这方面的初学者,所以我不知道发生了什么。这是我在构建 fmt 时可以在 cmake 中标记的东西,还是什么?对我来说奇怪的是,一切似乎都很好 fmt::output_file 等工作,但智能感知只是无法识别这些功能。我试过用谷歌搜索,但由于我的知识有限,我什至不知道问题出在哪里。

也只是例如,下面的 fmt github 的这个示例代码运行,但我无法自动填充 output_file 命令,并且智能感知在 output_file 函数上显示错误,说命名空间“fmt”没有成员“output_file”。

这也是我的 c_cpp_properties.json

感谢您的时间。

0 投票
1 回答
177 浏览

c++ - 无法弄清楚如何在 CRTP 模板类上正确专门化 fmt 模板

(注意:ostream 不是一个选项,不建议重载 ostream 运算符作为解决方案)(注意:显示每次尝试的实际工作测试代码在底部)

基本上我有一个看起来像这样的类heirachy:

我想为每个派生类重载 fmt::format,而不复制每个类的代码,因为为每种类型打印的实际代码将完全相同。

我首先尝试仅使用一个被专门化的派生模板类进行测试

这非常适合

然后我尝试看看我是否可以以某种方式使用 CRTP 基础进行专业化

这不起作用,我得到“静态断言失败:不知道如何格式化类型”,两种类型之间没有有效的转换,我猜这是因为显式模板转换问题。那我试试

似乎跳过了这个,我得到“静态断言失败:不知道如何格式化类型”,我猜是因为 fmt 内部使用的任何机制都需要存在实际的格式化程序类型才能使其工作。

然后我尝试使用 SFINAE 看看我是否可以这样做

我的 is_CRTP_derived 类看起来像:

第一次尝试如下所示:

我收到一个关于“模板参数在部分专业化中不可推导的错误:”好的,所以这不起作用接下来我尝试

似乎完全跳过了类型,我得到“静态断言失败:不知道如何格式化类型”。所以我尝试

我得到“错误:模板参数在部分专业化中不可推导出”然后我尝试

我得到错误:'struct fmt::v5::formatter' 的声明混淆了'struct fmt::v5::formatter' 的早期模板实例化。

那就是我放弃了。我不知道有什么其他方法可以真正让它工作我如何避免为每个 CRTP 派生模板类这样做?

编辑:

这是演示该问题的实际工作代码:

0 投票
2 回答
235 浏览

c++ - 我正在尝试使用 {fmt} 格式化模板

我有一个简单的模板,有点像:

这使我可以将其专门化为:

我希望能够用类似的东西格式化值

为此,我尝试将格式化职责转发到此处所述,formatter<int>但无济于事。我的尝试看起来像:

我已经尝试了几种变体但没有成功,错误往往围绕着这个:

我目前的解决方法是拥有一个成熟的格式化程序,它有自己的parse()方法format(),但对我来说,重新发明 Victor 已经写的轮子充其量是愚蠢的。

0 投票
1 回答
240 浏览

c++ - fmtlib:没有解析选项的用户定义类型的快捷方式?

我正在使用{fmt}C++ 库。我fmt::formatter为自己的类型编写了许多专业。其中大多数没有格式化选项,因此每个类都有一个样板实现parse(format_parse_context)

我希望fmt::formatter有一个没有选项的默认实现parse,但事实并非如此。这有什么捷径吗?上课之类的fmt::optionless_formatter

0 投票
1 回答
129 浏览

c++ - Understand fmt formatter parse function

I'm trying to under the parse function for creating a formatter for a custom type in fmt. In their documentation (https://fmt.dev/dev/api.html) there is this line that has some sort of loop construct I haven't seen before:

#xA;

It's obviously a loop using iterators, presumably something new in C++17. What is it? Full example here: https://godbolt.org/z/fEGvaj

0 投票
0 回答
86 浏览

c++ - fmt::format 访问冲突

我不知道这有什么问题。最近构建了一台新 PC,它工作得很好(相同的项目,Visual Studio 中的相同设置等)。但是由于某种原因,任何时候我尝试fmt::format它都会给我一个访问冲突异常。虽然如果使用 spdlog 格式化,例如它工作正常。

getType()只是返回一些识别信息,它现在是硬编码的,所以它不是 nullptr 或任何东西。相同getInfo()(除了返回文件和行号)

即使只是测试一些代码也会给我一个访问冲突错误:

我完全不知道为什么这不再适用于新 PC。

0 投票
1 回答
142 浏览

c++ - 使用 fmt 库通过回退到指针来格式化类型

我正在尝试使用

wheregetDataOrPointer应该返回一个void指针(它总是可以被格式化)或当格式化程序存在时的默认值:

我不知道怎么写:hasFormatter<T,char>检查它是否可以被fmt库格式化?我只希望在本地不总是这种后备。

0 投票
1 回答
295 浏览

c++ - c++ 使用 va_args 从 C 代码调用 fmt 库

我想将 fmt 库用作调试框架的一部分。然而,我们的项目是混合 c 和 c++。

fmt 与 c++ 配合得很好,但是在 c 中我们有 printf() 之类的格式字符串。

因此我必须从 C 代码中“隐藏”C++ 部分。c 中如何进行格式化的唯一方法(我知道)是使用 va_args。但是它们不适用于 fmt 模板,因为第一个模板在运行时执行,另一个在编译时执行

=>所以问题 你知道如何使用 C 代码中的 fmt 库吗?

谢谢你的输入:)

0 投票
1 回答
836 浏览

c++ - 使用 {fmt} 和 source_location 创建基于可变参数模板的日志记录功能

我想在 C++ 中创建一个简单的日志函数,将代码位置添加到日志消息中。我想整体避免使用宏以及__FILE__&的使用__LINE__

请注意,format字符串始终是编译时字符串,我希望在编译时进行尽可能多的计算(目标机器是小型 MCU)。

我可以source_location通过experimental/source_location. 我也可以使用{fmt}

我从这个开始。目前,我有以下内容:

哪个产生正确./example.cpp,20, invalid squishiness: 42

在我看来,我很接近。我认为剩下的就是让log函数采用默认参数source_location(我知道source_location::current()作为默认参数是一个很好的做法)。我收到以下错误:

:12:99: 错误: 参数 'args' 缺少默认参数

这甚至可以混合可变参数模板和参数的默认参数吗?如果是这样,怎么做?

此外,有没有办法将"{},{}, "部分添加到编译时format字符串以产生另一个编译时字符串(用作格式)?

0 投票
2 回答
291 浏览

c++ - C++ fmt 库。部分参数替换

我有一个大模板(从文件加载),我应该用它们的实际值替换命名参数。问题是我需要在两个不同的函数中执行此操作,因此需要将部分命名参数替换为 infunc1()和 part-in func2()

期望的行为是以下返回myarg1 myarg2

但是我 terminate called after throwing an instance of 'fmt::v6::format_error' what(): argument not found进入了第一个函数。

有没有办法在 中进行部分/渐进的参数替换fmt