C++ 将指针传递给非静态成员函数

2023-12-02

大家好:)我有一个关于函数指针的问题
我的“回调”函数参数是:
1)像这样的函数:int(*fx)(int,int)
2)一个int变量:int a
3)另一个int:int b
好吧,问题是我想传递给“回调”的函数是一个非静态函数成员:(并且有很多问题
如果比我聪明的人有时间的话,他可以看看我的代码:)

#include <iostream>
using namespace std;

class A{
private:
    int x;
public:
    A(int elem){
        x = elem;
    }

    static int add(int a, int b){
        return a + b;
    }

    int sub(int a, int b){
        return x - (a + b);
    }
};

void callback( int(*fx)(int, int), int a, int b)
{
    cout << "Value of the callback: " << fx(a, b) << endl;
}

int main()
{
A obj(5);

    //PASSING A POINTER TO A STATIC MEMBER FUNCTION -- WORKS!!
    // output = 'Value of the callback: 30'
    callback(A::add, 10, 20);

    //USING A POINTER TO A NON-STATIC MEMBER FUNCTION -- WORKS!!
    int(A::*function1)(int, int) = &A::sub;
    // output = 'Non static member: 3'
    cout << "Non static member: " << (obj.*function1)(1, 1) << endl;

    //PASSING A POINTER TO A NON-STATIC MEMBER FUNCTION -- aargh
    // fallita! tutto quello sotto non funziona --> usa i funtori???
    // puoi creare una classe wrapper ma non riuscirai mai a chiamare da callback
    int(A::*function2)(int, int) = &A::sub;
    int(*function3)(int, int) = obj.*function2; //[error] invalid use of non-static member function
    callback(function3, 1, 1);
}

有一种方法可以按照我尝试编写的方式创建指针,例如 int(*fx)(int, int) = some?
我搜索了很多,但没有人能给我答案(嗯,有一个答案:“不”,但我仍然认为我可以做点什么)

我还听说了函子,在这种情况下它们可以帮助我吗?

感谢任何人
PS:抱歉我的英语不好

编辑1: 我可以使用这样的东西:

template <class T>
void callback2( T* obj, int(T::*fx)(int, int), int a, int b)
{
    cout << "Value of the callback: " << (obj->*fx)(a, b) << endl;
}
void callback2( void* nullpointer, int(*fx)(int, int), int a, int b)
{
    cout << "Value of the callback: " << fx(a, b) << endl;
}

在我的主要内容中:

callback2(NULL, &mul, 5, 3); // generic function, it's like: int mul(int a, int b){return a*b;}
callback2(NULL, &A::add, 5, 3); //static member function
callback2(&obj, &A::sub, 1, 1); //non static member function

我并不完全满意,因为我不想将我的“callback2”传递给第一个参数(对象)......
对于那些不理解我的(糟糕的)解释的人来说,问题是:我可以删除回调2函数中的第一个参数吗?
原型将是

void callback2(int(*fx)(int, int), int a, int b)<br>

我会这样称呼:

callback2(&obj.sub, 1, 3);

函数不能这样引用:

int (*function3)(int, int) = obj.*function2;

您必须像这样传递函数的地址:

int (*function3)(int, int) = std::mem_fn(&A::sub, obj);
//                           ^^^^^^^^^^^^^^^^^^^^^^^^^

表达方式function2衰减为允许其工作的函数指针。

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

C++ 将指针传递给非静态成员函数 的相关文章

  • 如何在 ASP.NET MVC 中将 XML 文件发送到客户端

    在 ASP NET MVC 中 我有一个数据库表 我想在某个视图页面上有一个按钮 如果某个用户单击该按钮 我的应用程序将生成包含数据库中所有行的 XML 文件 然后 应将包含 XML 的文件发送到客户端 以便用户看到下载弹出窗口 同样 我希
  • 采用 std::vector 或 std::array 的模板函数

    我有一个函数 当前接受 2 个向量 其中可以包含任何普通的旧数据 template
  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • 如何通过覆盖 MSBuild 目标来防止外语资源生成?

    我正在致力于减少大型 C ASP NET 解决方案的编译时间 我们的解决方案使用通常的 resx 文件方法翻译成大约十几种外语 这些资源文件的解析和编译极大地减慢了我们的编译时间 并且是日常的挫败感 我知道可以创建自定义资源提供程序并摆脱
  • C# 异步任务比同步慢

    你知道为什么同步斐波那契方法比异步 等待更快并且比异步任务更快吗 我在每个项目方法上都使用了异步 所以主要是这是一个非常糟糕的方法 Code static int FibonacciSync int number if number 0 r
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • 如何通过 libwebsocket 发送异步数据?

    我正在将 Warmcat 的 libwebsocket C 库用于小型 Websocket 服务器 我已经启动并运行了这些示例 并且可以发送数据以响应从 websocket 接收数据 例如回显发送的反向字节 但是 我无法弄清楚如何在不使用
  • C# 中 PKCS11Interop 库的线程安全使用 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 PKCS11Interop 在 HSM 内执行密钥管理操作 我使用的 HSM 是 Thales PCI Express 下面是
  • 我可以将 char 或 DateTime 设置为 null 吗?

    我可以将 null 设置为char数据类型 并且DateTime在 C 中 多谢你们 这是不可能的 它是一个值类型 使用 char myChar null DateTime myDate null 这相当于 Nullable
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • ASP.net WebForms - 在标记中使用 GetRouteUrl

    我一直在尝试弄清楚如何将路由功能与 ASP net 4 0 WebForms 一起使用 我将一条路线添加到我的路线集合中 void Application Start RegisterRoutes RouteTable Routes voi
  • 使用 OleDbCommand / OleDbDataAdapter 读取 CSV 文件

    我不明白为什么 但是当我使用 OleDbDataAdapter 或 OleDbCommand 读取 CSV 文件时 在这两种情况下 生成的数据结构良好 它识别文件头中的列 但行数据都是空字符串 我之前已经成功进行过多次 CSV 处理 因此我
  • Unity - 在生成时获取随机颜色

    我有一个小问题 我想在我的场景中生成四边形 它们都应该有红色或绿色作为材质 但 Random Range 函数只能是 int 我该如何解决它 void SpawningSquadsRnd rndColor 0 Color red rndCo
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • 检查一个数是否是完全平方数?

    我认为以下代码存在精度问题 bool isPerfectSquare long long n long long squareRootN long long sqrt n 0 5 return squareRootN squareRootN
  • 如何根据当前日期时间发现财政年度?

    我需要基于当前或今天的日期时间的财政年度 假设我们认为今天的日期是10 April 2011 那么我需要输出为Financial Year 2012在某些情况下 我需要以短格式显示相同的输出FY12 我想以两种方式显示 在我们的要求中 考虑

随机推荐

  • ZF2:如何为dispatch.error附加模块特定侦听器

    有没有办法为该事件附加一个事件侦听器dispatch error在 Zend Framework 2 中 该侦听器将仅附加到与 Module php 相关的 EventManager 我通过附加监听器来实现这一点dispatch到全局 Sh
  • jQuery Mobile 中的粘性列表分隔线?

    有没有办法让 jQuery Mobile 列表分隔符标题固定 粘在页面顶部 直到下一个字母或列表分隔符出现并取代它的位置 我已经发现了这样的事情 https github com jquery jquery mobile blob mast
  • 从文本字符串中提取数字的公式

    如何从 Excel 或 Google Sheets 中的文本字符串中仅提取数字 例如 A1 a1b23eg67 A2 15dgrgr156 想要的结果是 B1 12367 B2 15156 您可以使用 Google 表格中的捕获组来完成此操
  • 使用 TObject 后代调用 std::vector::push_back 时,C++ Builder bcarm 错误

    我有一些简单的 C 代码 无法由 C Builder 10 1 Berlin 的基于 Clang 的 C 11 编译器 bccaarm 编译 这是代码 TComponent Comp new TComponent this std vect
  • Android:无法根据需要正确设置 TableLayout

    我在活动中显示来自数据库的数据 我想要一个桌子和底部的按钮 对于数据来说 TableLayout 是最好的选择 我将 TableLayout 添加到 Horizo ntalView 和 ScrollView 中 使其垂直和水平滚动 动态添加
  • 当 value 是 cls 的实例时,您可以注释返回类型吗?

    给定一个带有初始化辅助方法的类 class TrivialClass def init self str arg str self string attribute str arg classmethod def from int cls
  • 模拟器无法启动

    我只需安装 HAXM 安装程序和 Android SDK 工具 最后我的 AVD 就可以启动了 但问题是它在android上卡住了 我已经等了20分钟了 但还没开始 模拟器 设备 fd 664 HAXM 正在工作并且模拟器在快速 virt
  • asp dropdownlist - 将数字 1-15 添加到列表

    有没有一种方法可以将值 1 15 添加到 asp 下拉列表中 而不必单独执行每个值 我目前有 ddlAdults Items Insert 0 new listitem 1 1 ddlAdults Items Insert 1 new li
  • 如何从 MediaSessionManager 创建 MediaController 实例?

    我正在尝试从 RemoteController 迁移到 Lollipop 的 MediaController 但在获取 MediaController 实例时遇到问题 在 MediaController 中它说 如果您拥有 android
  • React 组件中的错误 - 无法验证用户注册

    当我尝试注册新用户时 在用户注册代码中 即使输入相同的密码 我不断收到 密码不匹配 错误消息 我不明白我哪里出了问题 我请求你帮助理解我哪里出了问题 感谢您的帮助 过去几天我一直在努力解决这个问题 但是我一直无法找到解决方案 这是用户注册组
  • 如何在 PHP 中将此日期 (dd/mm/yyyy) 格式化为 (j M Y)? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在尝试将此日期格式 在 PHP 中 dd mm yyyy 例如 18 08 2011
  • for循环中的if else语句?

    在我为学校做的项目的最后部分 我应该使用if else里面的声明for循环 但我不知道该怎么做 我可以使用大量if else声明做同样的事情 但我认为我的老师不会欣赏它 这是作业最后部分的说明 计算等级 A B C D 或 F 并存储在另一
  • ServiceStack - 如何禁用默认异常日志记录

    符合ServiceStack 文档 我们有一个全局服务异常处理程序 文档说这个处理程序应该记录异常然后调用DtoUtils HandleException 像这样 private object LogServiceException obj
  • 使用 selenium webdriver python 从共享点下载文件

    我正在尝试从 sharepoint url 下载文件并将代码写入neverask savetodisk但仍然显示保存文件的对话框 我尝试了相同的代码 当我们单击其他 URL 的下载链接但无法使用共享点应用程序时 它可以工作 这是我使用的代码
  • 桌面java应用程序通过USB复制和传输android数据

    我有一个桌面java应用程序 还有一个android应用程序 两个应用程序一起工作 桌面应用程序中的用户有一个按钮可以启动设备数据应用程序到计算机应用程序之间的传输 反之亦然 所以我需要用一根简单的USB线传输数据 而不需要互联网连接 Wi
  • R:在多个列中查找模式 - 可能是重复的()?

    我正在尝试隔离数据框中具有共同值的条目 请参阅下文以重建我的 df 的一部分 Stand lt c MY MY MY MY MY Plot lt c 12 12 12 12 12 StumpNumber lt c 1 2 3 3 7 Tre
  • 为什么在 MVVM 中使用命令

    我实际上正在学习 MVVM 模式 我无法理解有关命令的一件事 为什么要使用它们 为什么不只使用一个函数 在View 这调用了ViewModel的功能 给我们提供了什么命令 显然它们被广泛使用 但我找不到原因 为什么要使用命令 因为命令提供了
  • 如何使用 Python NetworkX 找到最长路径?

    我有一个从 S 到 T 的有向图 我想找到路线 S A C E T 及其容量之和 1 2 3 1 7 所以总和是最大的 我尝试了networkx algorithms flow ford fulkerson 但我不知道如何获得从S到T的单向
  • 带有命名参数的信号

    我正在尝试使用 PySide2 复制下面的示例 https evileg com en post 242 但由于 PySide2 不支持向 QML 发出带有命名参数的信号 我不知道如何使用 PySide2 来做到这一点 这是我的代码 mai
  • C++ 将指针传递给非静态成员函数

    大家好 我有一个关于函数指针的问题我的 回调 函数参数是 1 像这样的函数 int fx int int 2 一个int变量 int a3 另一个int int b好吧 问题是我想传递给 回调 的函数是一个非静态函数成员 并且有很多问题如果