将 std::bind 与成员函数一起使用,该参数是否使用对象指针?

2024-03-14

使用时std::bind要绑定成员函数,第一个参数是对象this指针。然而,它可以将对象作为指针传递,也可以不传递。

例如,请参见以下程序:

#include <iostream>
#include <functional>

struct foo
{
    void bar(int v) { std::cout << "foo::bar - " << v << '\n'; }
};

int main()
{
    foo my_foo;

    auto f1 = std::bind(&foo::bar, my_foo, 1);
    auto f2 = std::bind(&foo::bar, &my_foo, 2);

    f1();
    f2();
}

clang 和 GCC 都毫无怨言地编译了这个,并且结果适用于两种绑定:



foo::bar - 1
foo::bar - 2
  

我一直在努力理解规范(第 20.8.9 节),但这是我不太清楚的地方之一。

应该只有一个是正确的,还是两者都正确?


两者都是正确的。 20.8.9.1.2 转向 20.8.2 描述要求和调用的效果bind。 20.8.2 是:

20.8.2 要求 [func.require]

1 Define INVOKE(f, t1, t2, ..., tN) as follows:

(t1.*f)(t2, ..., tN) when f是一个指向类的成员函数的指针T and t1是一个类型的对象T或对类型对象的引用T或对派生类型的对象的引用T;

((*t1).*f)(t2, ..., tN) when f是一个指向类的成员函数的指针T and t1不是上一项中描述的类型之一;

t1.*f when N == 1 and f是指向类的成员数据的指针T and t1是一个类型的对象T或对类型对象的引用T或对派生类型的对象的引用T;

(*t1).*f when N == 1 and f是指向类的成员数据的指针T and t1不是上一项中描述的类型之一;

f(t1, t2, ..., tN)在所有其他情况下。

前两个选项允许引用和指针。

这里需要注意的重要一点是,措辞确实not将您限制为普通指针。你可以使用std::shared_ptr或其他一些智能指针,使您的实例在绑定时保持活动状态,并且它仍然可以使用std::bind as t1被取消引用,无论它是什么(当然,这是可能的)。

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

将 std::bind 与成员函数一起使用,该参数是否使用对象指针? 的相关文章

  • 当其源是 https uri 时如何使 wpf MediaElement 播放

    在 wpf 独立应用程序 exe 中 我在主窗口中包含了 MediaElement
  • 从另一个 FORM 中取回隐藏的 FORM

    我有两种形式Form1 and Form2 我正在打开Form2 from Form1 on button Click Form2 obj2 new Form2 this Visible false obj2 Show 然后我想回来Form
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • 从时间列表中查找最接近的时间

    所以 这是场景 我有一个带有创建时间的文件 我想从该文件的创建时间最接近或相等的时间列表中选择一个时间 完成此操作的最佳方法是什么 var closestTime listOfTimes OrderBy t gt Math Abs t fi
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • 从点云检测平面集

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

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • 测验;这个编译了吗?如果是的话它会返回什么(我知道答案)

    我最近发现这个错字 if name find string npos 显然开发者的意思是输入 if name find string npos 但令我惊讶的是发现错误甚至编译 Wall Werror 没有尝试过 pedantic 那么 咖啡
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • 当 Verb="runas" 时设置 ProcessStartInfo.EnvironmentVariables

    我正在开发一个 C 应用程序 我需要创建变量并将其传递给新进程 我正在使用ProcessStartInfo EnvironmentVariables 新进程必须提升运行 因此我使用 Verb runas var startInfo new
  • 解释这段代码的工作原理;子进程如何返回值以及在哪里返回值?

    我不明白子进程如何返回该值以及返回给谁 输出为 6 7 问题来源 http www cs utexas edu mwalfish classes s11 cs372h hw sol1 html http www cs utexas edu
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 对多个对象使用事件处理程序

    我有 20 件物品List

随机推荐

  • python 基于部分字符串匹配合并两个 pandas 数据框

    我是 Python 新手 在连接两个 pandas 数据框时遇到很多麻烦 因为合并应该基于部分字符串匹配 进一步来说 我有一个名为的数据框df看起来像这样 writtenAt 2015 01 01T18 31 01 00 00 conten
  • Oracle sql 按当天对工作日进行排序

    我试图根据顺序对日期进行排序 周六 周日 周一 周二 周三 周四 周五 我正在尝试使用案例 select day CASE day WHEN 1 THEN 1 WHEN 2 THEN 2 WHEN 3 THEN 3 WHEN 4 THEN
  • Netsuite 脚本 beforeLoad 记录未被修改

    我试图在用户打开采购订单时修改它 这似乎是一个非常简单的例子 但似乎不起作用 在 GUI 中我没有看到 测试 备忘录 在脚本调试中 备注字段为空 由于调试 我知道脚本正在运行 Update Drop Ship PO with route I
  • Express Checkout 错误消息:“安全标头无效”

    我正在实施快速结帐在贝宝 前两步我没有问题SetExpressCheckout and GetExpressCheckout 但是当我使用DoExpressCheckout 我遇到错误 安全标头无效 API 凭证是相同的 我已经通过更改来修
  • ec2 每次启动时运行脚本

    我在这里关注了一些帖子 尝试在每次启动后 而不仅仅是第一次启动 在我的 ec2 实例上运行 python 或 shell 脚本 我已经尝试过 脚本用户 始终 到 etc cloud cloud cfg 文件 将脚本添加到 scripts p
  • 如何在纯 PHP 中执行 HTTP 重定向后获取最终 URL?

    我想做的是找出重定向后的最后 最终 URL 是什么 我不想使用 cURL 我想坚持使用纯 PHP 流包装器 现在我有一个网址 比方说http 域名 test http domain test 我使用 get headers 从该页面获取特定
  • 如何将变量传递给布局?

    我的应用程序布局有两个版本 它们仅在几行中有所不同 考虑以下示例 html head a lot of code here body some more code here if defined flag and flag true var
  • iOS 7.1:当应用程序在后台时获取核心运动数据(加速计、陀螺仪)

    我想知道当应用程序处于后台模式时如何继续接收运动传感器值 我意识到那里已经有几个帖子了 例如 我尝试过iPhone 上的 Nike GPS 如何在后台接收加速度计更新 https stackoverflow com questions 87
  • Bouncy Castle 在 CBC 模式下使用 AES 进行基于密码的加密

    我最近遇到了一段在 CBC 模式下使用 BouncyCastle 的 PBE 和 AES 的代码 PBEWithSHA1And256BitAES CBC BC public static final String ALGORITHM PBE
  • 给出很多间隔 [ai, bi],找到与最多间隔数相交的间隔

    给定很多间隔 ai bi 找到与间隔数量最多的间隔 我们能在 O nlogn 或更好的时间内做到这一点吗 我只能想到 n 2 方法 假设间隔给出为 a1 b1 an bn 制作一个长度已排序的数组2n关系被打破的地方 if ai aj 然后
  • PostgreSQL - jsonb_each

    我刚刚开始在 postgres 上使用 jsonb 并在网上很难找到示例 因为它是一个相对较新的概念 我尝试使用 jsonb each text 打印出键和值表 但在单列中获取 csv 我将下面的 json 保存为 jsonb 并用它来测试
  • ggplot 中仅一个图例的标签为斜体

    我正在尝试格式化一个侧面有两个独立图例的绘图 我有一个用于所有不同分类单元的形状图例 以及一个用于它们所属类别的颜色图例 我只想将形状图例中的分类单元名称斜体化 而不将颜色图例中的类别名称斜体化 到目前为止 我可以使用这一行将所有图例条目设
  • 如何以自定义方式从主题恢复全局存储?

    假设我在从主题获取数据后将数据存储在 Globalstore 中时正在进行一些自定义处理 即我正在根据 message 的值创建自定义键 在本地删除状态后 它会以相同的方式再次恢复 Globalstore 吗 override def pr
  • 无法在 Android Studio 中使用 compose 检查器 (Flamingo 2022.2.1)

    设备的网络正常工作 但如屏幕截图所示 我无法连接到以下 URL maven google com 导致撰写检查器无法正常工作 我尝试修改旧版本 Compose 的版本 但没有解决问题 我可以以某种方式设置 URL 或其他解决方案 以便我可以
  • 如何使用express启用cors nodejs?

    总之 我正在使用一个像 api 这样的 dicom 文件查看器 称为 Cornstone 为此 我连接到 dc4chee 的 WADO 服务来获取 dicom dcm4chee 运行端口 8080 而我在节点上的应用程序使用端口 3000
  • 加载.csv文件时如何将当前系统时间戳插入db2数据库基列

    下面的类将把 csv 导入到数据库表中 它工作正常 现在我需要更新同一个表中的另一列 其中当前系统时间戳需要获取 当该程序在数据库表的相应列中执行时得到更新 示例 在 Db2 表中 主题列为 英语社会数学时间戳 在 CSV 文件中只有 3
  • 实体框架代码优先迁移保留现有数据

    我正在使用 EF 6 1 并且对包含生产环境中的数据的现有数据库使用代码优先方法 是否有可能迁移模型更改并保留现有客户的数据 是的 但是 根据具体情况 更改的复杂性 它可能会很复杂 概述 https learn microsoft com
  • dojo 中的状态服务器端过滤

    我正在 dojo 1 10 版本的增强网格中进行服务器端过滤 Here https dojotoolkit org reference guide 1 10 dojox grid EnhancedGrid plugins Filter ht
  • 如何自动删除项目的所有system.out.println语句,包括所有多行Sop语句[重复]

    这个问题在这里已经有答案了 实际上我想自动化删除所有的过程System out println 在将项目交付给客户之前 对整个项目进行陈述 怎么做 按 ctrl H 转到文件搜索 将包含文本填充为System out println 文件名
  • 将 std::bind 与成员函数一起使用,该参数是否使用对象指针?

    使用时std bind要绑定成员函数 第一个参数是对象this指针 然而 它可以将对象作为指针传递 也可以不传递 例如 请参见以下程序 include