为什么 std::apply 使用函数模板会失败,但使用具有显式模板参数列表的 lambda 表达式却不会失败?

2024-03-22

在查看 std::apply 的引用时参考参数 https://en.cppreference.com/w/cpp/utility/apply我们可以看到函数模板不能作为 std::apply 的可调用对象传递。让我们考虑以下函数模板:

template<typename T>
T add_generic(T first, T second) { return first + second; }

因此,由于无法在 std::apply 调用中推导函数模板,因此我们不能使用以下代码:

std::apply(add_generic, std::make_pair(2.0f, 3.0f)); // Error: can't deduce the function type

请注意,这不是同一个问题这个问题 https://stackoverflow.com/questions/43171323/why-does-stdapply-fail-with-a-generic-function。在该答案中,作者编写了一个没有显式模板参数的 lambda 表达式。

std::cout << std::apply(
    [](auto first, auto second) { return add_generic(first, second); },
    std::make_tuple(2.0f,3.0f)) << '\n';

但正如你所知c++20 https://en.cppreference.com/w/cpp/language/lambda您可以使用带有显式模板参数列表的 lambda 表达式。所以我尝试了这个功能,令人惊讶的是编译器没有引发任何错误。

std::apply([]<typename T>(T first,T second){
    return first+second;
},std::make_pair(2.0,3.0));

为什么编译器能够在最后一种情况下推断出类型?两者有什么区别吗?


一个功能template不是一个函数,就像饼干模具不是饼干一样。 C++ 模板为每组模板参数创建新函数。这正是为什么add_generic这不是一个可行的论点。它不是一个函数,它不能作为值传递。为了获得该函数,编译器需要推导模板参数。但它只能在内部做到这一点apply after可调用已通过。鸡和蛋就在那里。

为什么 lambda 有效?因为它也不是一个简单的函数。它产生一个隐藏对象类型

struct __lambda_at_line_N {
  template<typename T>
  auto operator()(T first, T second) { /* ... */ }
};

并通过that

std::apply(__lambda_at_line_N{},std::make_pair(2.0,3.0));

这是一个实际的对象,一个值。它的类型不依赖于内部需要发生的模板参数推导std::apply打电话operator()。这就是它起作用的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 std::apply 使用函数模板会失败,但使用具有显式模板参数列表的 lambda 表达式却不会失败? 的相关文章

  • 当从后台工作程序发生事件时,XlCall.Excel(XlCall.xlcCalculateNow) 抛出 XlCallException

    我有一个 ExcelFunction 来排队一些计算 ExcelFunction public static void QueueCalcs takes ranges var calcRequests builds list of calc
  • 当其源是 https uri 时如何使 wpf MediaElement 播放

    在 wpf 独立应用程序 exe 中 我在主窗口中包含了 MediaElement
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • libtool 在 Ubuntu 13.04 上构建 thrift 0.9.1 时出错

    在 Ubuntu 13 04 上构建 thrift 0 9 1 支持 C C java C perl python 时出现此错误 configure 不带任何选项运行 make 不带任何选项运行 Making all in test mak
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • Rails:named_scope、lambda 和块

    我认为以下两个是等效的 named scope admin lambda company id conditions gt company id company id named scope admin lambda do company
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 使用 IdentityDbContext 和 Code First 自动迁移表位置和架构的实体框架?

    我正在尝试使用 IdentityDbContext 类设置自动迁移更新 并将更改传播到整个数据库的实际 DbContext 在进入代码之前 在使用自动迁移实现 IdentityDbContext 时 我收到此错误 影响迁移历史系统表位置的自
  • Emacs C++,打开相应的头文件

    我是 emacs 新手 我想知道 是否有在头文件 源文件和相应的源文件 头文件之间切换的快捷方式 是否有像通用 emacs 参考卡那样的参考卡 Thanks There s ff find other file 您可以使用以下方法将其绑定到

随机推荐

  • 没有重复子项的树

    Using anytree https pypi python org pypi anytree我制作了这样的树 A B C D F B C E G 有没有办法删除所有重复的子级并将其变成下面的树 对所有可能级别的子级进行递归 A B C
  • Android:如何重置发布版本的 resConfigs?

    为了让开发更快 我想做以下事情 android defaultConfig resConfigs en 我的应用程序有多种语言 这样做可以在开发时节省大量时间 但是 我不想发布包含此集的版本 很遗憾 resConfigs不适用于产品口味或构
  • 如何使用管道分隔符导出到 .csv

    我使用 Google Sheets 电子表格 来合并我的 Gambio 商店的不同来源的文章数据 要导入数据 我需要在 csv 文件中使用管道符号作为分隔符 分隔符 并使用 作为文本分隔符 在用于导出到 csv 的 Google 表格菜单中
  • 我可以在 POSTMAN 中发送二维数组作为参数吗?

    我需要在 POSTMAN 中将参数作为对象数组发送 array field1 html field2 5 field1 css field2 3 我知道数组必须发送为array 但如何将数组中的一项设置为对象呢 我试过这个 array fi
  • 一次播放多个声音?

    我在一个视图上有 6 个声音 然而我想要它 这样我就可以一次播放多个声音 所以你点击声音 1 声音 1 正在播放 然后声音 2 播放 当声音 1 仍在播放时 但此时我按声音1 声音1播放 按声音2 声音2播放 但声音1停止 这是音频部分的代
  • 当我们有 LinkedBlockingQueue 时,为什么还要使用 ConcurrentLinkedQueue?

    我为什么要使用ConcurrentLinkedQueue当我有LinkedBlockingQueue 我知道ConcurrentLinkedQueue是非阻塞的但是LinkedBlockingQueue可以作为ConcurrentLinke
  • 适用于 Windows 的命令行对话框工具

    我需要一个类似于 cdialog 或whiptail 的对话框工具 但可以在 Windows 上运行 我有 MinGW 从源代码编译一些东西是没有问题的 但据我所知 cdialog 和 Whiptail 都包含特定于 UNIX 的代码 因此
  • Spring Boot不加载静态资源

    有很多关于 spring boot 不加载静态资源的问题 并且读完它们 几乎 后我仍然无法解决这个问题 在这个阶段 我选择不使用 Spring Boot 运行 但我仍然想知道问题是什么 我正在使用 Eclipse Java 8 和 Mave
  • 使用 VLC 将文件流式传输为 RTSP

    我需要创建一个可以将 mp3 文件流式传输到另一个设备的服务器 我打算使用 VLC 我查看了 VLC 文档 并对执行此操作的前进方向感到困惑 我找到了这个链接 http www videolan org doc streaming howt
  • T-SQL 到 XML - 每个属性的多个值可以在自己的行中列出吗?

    我目前正在使用 T SQL 将一些数据转换为 XML 我需要在自己的行上列出属性的值 由于某种原因 T SQL 到 XML 不断将值连接在同一行上 示例代码 SELECT Fruits AS Attribute name Apple AS
  • jQuery 中的triggerHandler 与触发器

    出于好奇 jQuery 的目的 用例是什么triggerHandler 据我所知 两者之间唯一 真正 的区别trigger and triggerHandler是本机事件是否触发 以及事件冒泡行为 尽管triggerHandler的冒泡行为
  • RUBY - SSL、基本身份验证和 POST

    我对此感到相当困难 似乎有一些代码片段我似乎无法拼凑在一起 我只是想发布键 值对 但是得到Connection refused connect 2 Errno ECONNREFUSED Help require net http requi
  • Spark Driver 内存计算

    我知道如何计算执行器核心和内存 但是谁能解释一下spark driver memory是根据什么计算的 操作于Dataset比如collect take需要将所有数据移至应用程序的驱动程序进程中 并且在非常大的数据集上执行此操作可能会导致驱
  • MVC 3 授权自定义角色

    我是 MVC 3 新用户 我正在尝试通过 SQL 数据库进行管理 首先 我有客户实体 可以通过管理字段定义管理 该字段是客户实体中的布尔类型 我只想在产品页面中访问管理员 而不是在普通客户中 我想制作 Authorize Roles adm
  • 带字符串的多行内联汇编宏

    我正在尝试实现一个宏 MY MACRO 它存储某个部分中前面带有 32 位整数的字符串 my section 例子 MY MACRO 200 my first string u x 以下是我尝试过的选项以及我面临的问题 我将不胜感激任何帮助
  • 在调试器中跳过表达式主体属性

    有没有类似的 DebuggerStepThrough 属性可用于 C 中的表达式主体属性 例如我想跳过代码 public Byte ByteArray gt Builder CreateArray DebuggerStepThrough 不
  • 如何不在 NextJS 登录页面上渲染布局组件

    如何排除渲染Layout当路由为 login register等等 在 NextJS 中 const MyApp Component pageProps gt return
  • 为什么 javascript 在 if 语句中接受逗号?

    我偶然发现了一些 JavaScript 语法 看起来应该会产生某种解析错误 但实际上却没有 if true true console log splendid else console log horrid splendid if true
  • 隐藏选择的选项组及其内容(所选选项除外)

    我想为国家 地区创建一个选择标签 当我们选择国家 地区时 它会隐藏所有 optgroup 及其国家 地区选择标签的内容 但 optgroup 及其内容与所选国家 地区选项具有相同标签 例如
  • 为什么 std::apply 使用函数模板会失败,但使用具有显式模板参数列表的 lambda 表达式却不会失败?

    在查看 std apply 的引用时参考参数 https en cppreference com w cpp utility apply我们可以看到函数模板不能作为 std apply 的可调用对象传递 让我们考虑以下函数模板 templa