我如何在C++像在 Python 中一样实现 f 字符串?
How I can implement f-string in C++ like in Python?
我想为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 现在支持字符串插值作为另一个答案指出的。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 我如何在C++像在 Python 中一样实现 f 字符串?
- 在C 中,可以用语法[i,j,..]实现访问数组元素的功能,而语法就像numpy中的ndarray样式一样
- 如何实现数据结构,就像C 中的数组一样支持不同的类型元素
- 我需要一个像堆栈一样的数据结构,但具有随机访问,但是,我应该实现什么
- 为什么我的CUDA实现和我的CPU实现一样快