”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 C++ 中对所有可变参数模板参数调用函数?

如何在 C++ 中对所有可变参数模板参数调用函数?

发布于2024-11-19
浏览:575

How to Invoke a Function on All Variadic Template Arguments in C  ?

C 可变参数模板:在所有模板参数上调用函数

在 C 中,通常需要迭代可变参数模板参数并执行特定操作,例如调用一个函数。这可以使用以下任一方法来实现:

C 17 Fold Expression

(f(args), ...);

但是,如果被调用的函数可能返回一个对象对于重载的逗号运算符,您应该使用:

((void)f(args), ...);

Pre-C 17 Solution

常见方法是利用列表初始化并在其中执行扩展:

{ print(Args)... }

由于 print() 返回 void,您可以通过返回 int 来解决该问题:

{ (print(Args), 0)... }

为了确保它适用于任意数量的参数,您可以使包始终至少有一个元素:

{ 0, (print(Args), 0)... }

您可以将此模式封装到可重用的宏中:

namespace so {
    using expand_type = int[];
}

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }

要处理重载的逗号运算符,可以修改宏:

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) \
        ::so::expand_type{ 0, ((PATTERN), void(), 0)... }

如果您担心不必要的内存分配,您可以定义一个支持列表的自定义类型 -初始化但不存储数据:

namespace so {
    struct expand_type {
        template <typename... T>
        expand_type(T&&...) {}
    };
}
最新教程 更多>
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    编程 发布于2024-11-19
  • 如何用Java播放WAV文件?
    如何用Java播放WAV文件?
    使用Java播放WAV文件开发Java应用程序时,播放音频文件是一个常见的需求。本教程提供了播放 *.wav 文件的全面解决方案,使您能够将音效和音频合并到 Java 程序中。首先,创建一个类来处理音频播放。在下面的示例中,我们创建一个 MakeSound 类,其中包含播放音频文件的方法:publi...
    编程 发布于2024-11-19
  • 为什么 Java 中可以使用空对象引用调用静态方法?
    为什么 Java 中可以使用空对象引用调用静态方法?
    使用空引用访问静态方法在 Java 中,在空引用上调用方法通常会触发 NullPointerException。然而,静态方法的行为有所不同。静态方法与实例方法在 Java 中,方法可以是静态的,也可以是实例的。静态方法属于类本身,可以直接使用类名调用,而实例方法与对象关联,需要对象引用才能调用。使...
    编程 发布于2024-11-19
  • 如何使用 g++ 创建和使用静态库?
    如何使用 g++ 创建和使用静态库?
    使用 g 创建和使用静态库 在软件开发中,通常需要将可重用代码打包到称为库的模块化单元中。静态库是一种在编译时与可执行文件链接的库。本文将指导您完成使用 GNU 编译器集合 g 创建和使用静态库的过程。创建静态库创建静态库从 header.cpp 和 header.hpp:编译 header.cpp...
    编程 发布于2024-11-19
  • 如何将 MySQL DATE 数据类型转换为人类可读的格式?
    如何将 MySQL DATE 数据类型转换为人类可读的格式?
    MySQL DATE 数据类型的格式转换使用 MySQL 时,在 DATE 数据类型中存储日期可能会导致意外值,例如“ 0000-00-00”。这种格式对于可视化和数据处理来说可能会令人困惑。要解决这个问题,了解 MySQL 如何表示日期以及如何将它们转换为所需的格式至关重要。MySQL DATE ...
    编程 发布于2024-11-19
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-19
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-19
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-11-19
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-19
  • 尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    解决 PHP 中的 POST 请求故障在提供的代码片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"检查 $_POST数组:表单提交后使用 var_dump 检查 $_POST 数...
    编程 发布于2024-11-19
  • 为什么 GCC 无法使用初始化列表初始化 std::array?
    为什么 GCC 无法使用初始化列表初始化 std::array?
    初始化列表和 std::array:GCC BugC 标准库中的 std::array 类提供了一个固定的-大小数组容器。人们普遍认为此类支持初始化列表。但是,使用 GCC 4.6.1,尝试使用以下语法初始化 std::array 实例会失败:std::array<std::string, 2...
    编程 发布于2024-11-19
  • 为什么实体框架向导在集成 MySQL 时崩溃?
    为什么实体框架向导在集成 MySQL 时崩溃?
    Entity Framework 向导在 MySQL 数据库集成中遇到错误Entity Framework (EF) 提供数据库优先的建模功能,允许与各种SQL Server 和 MySQL 等数据库。但是,在针对 MySQL 数据库更新模型时,用户在 EF 向导期间可能会遇到崩溃。其中一个场景是当...
    编程 发布于2024-11-19
  • 我的第一个数据分析项目
    我的第一个数据分析项目
    简介和目标 在我的数据分析项目中,我进行了全面的分析工作流程,以满足现代组织对数据驱动决策日益增长的需求。我的主要目标是建立数据库连接并进行彻底的分析程序以提取有意义的见解。通过实施机器学习算法和先进的可视化技术,我开发了一个框架,将原始数据转换为可操作的情报,从而实现战略决策过程。我的方法侧重于...
    编程 发布于2024-11-19
  • 如何解决 Go HTTP 请求中的“需要代理验证”错误?
    如何解决 Go HTTP 请求中的“需要代理验证”错误?
    Go中HTTP请求的代理认证当使用经过认证的代理IP地址进行HTTP请求时,你可能会遇到“需要代理认证” “ 错误。要解决此问题,您需要提供代理服务器的用户名和密码。设置代理身份验证在用于请求的 HTTP 传输中,设置如下所示:auth := "username:password"...
    编程 发布于2024-11-19
  • 了解网络抓取
    了解网络抓取
    网络抓取是使用机器人从网站提取数据的过程,它涉及通过以编程方式检查所需的特定信息来从网页获取内容,其中可能包括文本、图片、价格、网址和标题。 笔记 网络抓取必须负责任地进行,尊重服务条款和法律准则,因为某些网站限制数据提取。 网页抓取的应用 电子商务 - 监控竞争对手之间的价格趋势和产品可用性 市场...
    编程 发布于2024-11-19

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3