我如何在C++像在 Python 中一样实现 f 字符串?

How I can implement f-string in C++ like in Python?

本文关键字:一样 实现 字符串 C++ 像在 Python      更新时间:2023-10-16

我想为C++创建一个F字符串,就像在Python中一样。但是我不明白大括号{}中的表达式是如何解析的。

示例(蟒蛇(:

world = "world"
print(f "Hello {world}")

我该怎么做,但在C++?

std::string world = "world!"
std::cout << f("Hello {world}") << std::endl;

输出

Hello world!

一旦程序被编译(并且不使用调试模式(,变量的名称就会丢失。因此,即使您解析了 f 字符串,也无法直接识别预期的变量。

但这是一个由预编译器解决的真实用例:您使用特殊声明,这些声明要么依赖于宏来保存 f 字符串中允许的变量的名称,要么使用预编译器阶段将特殊代码转换为C++代码 + 执行所需的特殊处理(此处将变量的名称保存在映射中(。使用宏的示例可以在Microsoft MFC中找到,预编译器的示例可以在qt或Oracle pro*C中找到。

恐怕开发起来会比程序员的收益更复杂,所以我的答案归结为可能是可能的,但恕我直言,不值得

正如Serge Ballista和其他人已经写过的那样,cout(目前(不可能解析变量的名称以插入其内容C++。尽管如此,还是可以使用带有参数编号/位置的格式字符串。有了这些,您可以将相应的变量作为参数传递,并用它们的位置编号引用它们。C++20 在<format>标准库中定义了 std::format。如果您使用的是较旧的编译器版本,则可以使用增强格式库,如以下示例所示:

#include <iostream>
#include <boost/format.hpp>
int main()
{
std::string a("world");
std::string b("Hello");
std::cout << boost::format("%2% %1%!n") % a % b;
return 0;
}

正如许多评论所指出的,没有这样的字符串插值工具。 但是,如果您尝试制作具有某些变量输出的字符串,则可以使用 sprintf 来模拟字符串插值。

更新:现在此评论无效。C++20 现在支持字符串插值作为另一个答案指出的。