使用折叠表达式打印所有带有换行符的可变参数

2023-11-25

C++17 折叠表达式的经典示例是打印所有参数:

template<typename ... Args>
void print(Args ... args)
{
    (cout << ... << args);
}

Example:

print("Hello", 12, 234.3, complex<float>{12.3f, 32.8f});

Output:

Hello12234.3(12.3,32.8)

我想在我的输出中添加换行符。但是,我找不到一个好的方法来做到这一点,到目前为止我发现的最好的方法是:

template<typename ... Args>
void print(Args ... args)
{
    (cout << ... << ((std::ostringstream{} << args << "\n").str()));
}

然而,这并不是零开销,因为它构建了一个临时的ostringstream对于每个参数。

以下版本也不起作用:

(cout << ... << " " << args);

error: expression not permitted as operand of fold expression

And

(cout << ... << (" " << args));

error: invalid operands to binary expression 

我明白为什么最后两个版本不起作用。 使用折叠表达式是否有更优雅的解决方案来解决这个问题?


Update: T.C.下面的评论提供了更好的解决方案:

template<typename ... Args>
void print(Args ... args)
{
    ((cout << args << '\n'), ...);
}

您可以使用折叠表达超过逗号运算符:

template<typename ... Args>
void print(Args ... args)
{
    ([](const auto& x){ cout << x << "\n"; }(args), ...);
}

Usage:

int main()
{
    print("a", 1, 1000);
}

a

1

1000

(注意:这也会打印尾随换行符。)

  • 现场魔杖盒示例

  • Godbolt 上的装配比较


解释:

  • [](const auto& x){ cout << x << "\n"; }是一个 lambda 给定x prints x and '\n'.

  • [](const auto& x){ cout << x << "\n"; }(args)立即调用 lambdaargs.

  • ([](const auto& x){ cout << x << "\n"; }(args), ...)是一个折叠表达式逗号运算符以下列方式扩展:

    // (pseudocode)
    [](const auto& x){ cout << x << "\n"; }(args<0>),
    [](const auto& x){ cout << x << "\n"; }(args<1>),
    [](const auto& x){ cout << x << "\n"; }(args<2>),
    // ...
    [](const auto& x){ cout << x << "\n"; }(args<N>)
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用折叠表达式打印所有带有换行符的可变参数 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内

随机推荐

  • __path__ 有什么用?

    我从来没有注意到 path 今天之前在我的一些包上定义的属性 根据文档 套餐支持多一特价 属性 path 这是 初始化为一个列表 其中包含 保存目录的名称 包的 init py代码之前 在该文件中被执行 这 变量可以修改 这样做 影响未来对
  • Delphi Statictext字体颜色变化无样式

    我想将 StaticText 字体颜色从黑色更改为clBlue 我该怎么办 目前我正在做 StaticText Font Color clBlue 但这对颜色没有影响 我能做些什么 谢谢 The TStaticText控件是 Win32 的
  • 损坏的 Java Mac 10.6

    一些背景 在 Mac OS X 10 6 上使用 Macports 我有DYLD LIBRARY PATH在我的 bash profile 中设置 问题 当我跑步时java version我收到此错误 VM初始化期间发生错误无法加载本机库
  • 前导美元符号如何影响 Bash 中的单引号?

    我需要从 Bash CLI 将字符串作为其参数传递给程序 例如 program don t do this 该字符串可以包含任何字符 例如 等等 我不希望 Bash 做任何修改 所以我考虑使用单引号 但是以下方法不起作用 program d
  • Maven Javascript 压缩器

    我想知道如何使用 maven 压缩 javascript 文件 我已经访问过类似的网站http mojohaus org javascript maven tools guide webapp development html但没有解释实施
  • iPhone 企业部署:移动设备管理

    我在企业中阅读有关 iPhone 的资料 看到了一些有关移动设备管理服务器的内容 据我所知 有一些第 3 方 MDM 供应商 但 Apple 表示可以实施自己的供应商 iPhone 配置实用程序允许您为 MDM 设置服务器 URL 签入 U
  • PHP 正则表达式和 JavaScript 正则表达式之间的区别

    您好 我想在 spry java 脚本框架中使用下面的 php 正则表达式 但它们不适用于 spry 框架 并且 spry 不允许用户输入 1 d 2 x 600 x 6FF s x 600 x 6FF u 3 x 600 x 6FF d
  • 如何跟踪 Javascript 事件(堆栈跟踪)?

    在任何编程语言中 我都可以跟踪任何函数并知道哪个函数被其他函数调用 但在 Javascript 中 我不知道如何 因为代码不是我写的据我所知 Firebug 没有提供此功能 一个例子 我想显示单击 XYZ 元素时调用的每个函数的函数名称 并
  • 使用 Lambda 和递归函数调用了解 QTimer

    我有以下代码 void class Testfunc QTimer timer new QTimer QObject connect timer QTimer timeout this emit Log Time out TestFunc
  • 如何在 Twig 过滤器“替换”中使用变量

    从 php 的表单中移交一个数组 repl arr array serach string1 gt replace1 对于 Twig 模板 我想在每个替换过滤器中替换 Twig 变量中的字符串 如下所示 block replace repl
  • Excel 和 EPPlus .NET 库:高级下拉列表验证

    在 Epplus 中 当我们为 Excel 文件中的某些单元格创建下拉列表时 然后用户输入一个不属于列表的值 该单元格会显示一条消息 值必须与列出的项目之一匹配 除了此消息之外 是否可以阻止用户输入不属于下拉列表的值 提前致谢 我用下面的代
  • 使用陈述问题

    我有两个问题 1 是否应该始终在连接上使用 using 语句 那么 我会在连接上使用它 然后在连接内的阅读器上使用另一个吗 所以我会使用两个 using 语句 2 假设您在连接上使用 using 语句 并且在连接上返回了一个读取器 所以你有
  • Perl 中的核心、供应商和站点位置之间有什么区别?

    我最近在安装某些模块时遇到了一些麻烦 并惊讶地发现许多已安装的模块都有重复的安装和版本 尝试使用以下命令跟踪标准 如果有这样的东西 安装中的内容cpanm 我发现以下结果非常令人困惑 报告显示了这些位置 Using cpan V cpan
  • 开发过程中应该如何使用identifierForVendor?

    Apple 建议使用 UIDevice currentDevice identifierForVendor 每次在 iOS 模拟器中运行应用程序时 该值都会发生变化 我的应用程序中的初始功能要求我将设备识别为一种光身份验证形式 这使得开发变
  • django-tastypie 和多对多“通过”关系

    在 Django 和 Tastypie 中 我试图找出如何正确处理多对多 通过 关系 如下所示 https docs djangoproject com en dev topics db models extra fields on man
  • 在 AngularJS 中,我可以在 ngView 之外的 ngSwitch 中使用当前路由吗

    我正在尝试根据当前视图更改页眉 标头位于 ngView 之外 这是可能的还是我需要将标题放在视图中 我的代码看起来与此类似 div div div Welcome div div Our products div div Contact u
  • 用逗号分割字符串列表

    我想转换 60 78 70 77 80 74 90 75 100 74 110 75 in to 60 78 70 77 etc 我以为我可以用 for word in lines word word split newlist appen
  • Yahoo 和 MS 支持 Oauth 2.0 吗?以及有关 oAuth 2.0 的几个问题

    我有几个问题 yahoo 和 microsoft api 支持吗 oAuth 2 0 如果是的话主要是什么 应采取的安全措施 转移时得到照顾 oAuth 1 0 到 oAuth 2 0 Google API 支持 oAuth 2 0 但 他
  • 从文本文件中解析数据

    我有一个文本文件 其内容如下 ENTRY 01 ID 01 Data1 0 1834869385E 002 Data2 10 9598489301 Data3 0 1091356549E 001 Data4 715 然后是一个空行 并重复更
  • 使用折叠表达式打印所有带有换行符的可变参数

    C 17 折叠表达式的经典示例是打印所有参数 template