如何在函数声明中声明 C++ mem_fn(member_function) ?

2024-04-12

我理解将成员函数的地址传递到类之外的基本问题。我感觉 mem_fn() 可能是解决方案,但我在具体细节上遇到了麻烦。

我在类 p 中有一个成员函数,当前声明为

typedef void (*valNamedFlagsCallback)(const int, const bool);
bool valNamedFlags(const OptBlk *operand, const char *description_of_value_or_NULL, const int subscripts[], const char *names[], valNamedFlagsCallback callBack);

在 e 类中,我尝试使用 valNamedFlags 调用

pInstance->valNamedFlags(operand, "Statement types", statementsSubscripts, statementsNames, std::mem_fn(&e::setStatement));

(我一开始没有使用 mem_fn() ,但当然这有经典的“指向成员函数的指针”问题。我尝试过 &e::setStatement 和普通的 &setStatement。)

FWIW,setStatement 的原型为

  void setStatement(const int ifcid, const bool isAffirmative);

如果我消除 mem_fn() 并将 setStatement 声明为静态,则一切正常。我只是指出这一点,以表明我已经消除了所有其他可能的问题;我唯一的问题是“指向成员函数的指针”问题。不幸的是,setStatement() 需要是一个成员函数,而不是静态函数。

我在 MS VS 2010 中遇到的具体错误是

bool p::valNamedFlags(const OptBlk *,const char *,const int [],const char *[],p::valNamedFlagsCallback)' : 无法将参数 5 从 'std::tr1::_Mem_fn3<_rx _arg0>' 到 'p::valNamedFlagsCallback'

我想保持回调声明独立于类 e;也就是说,我不想去

typedef void (*e::valNamedFlagsCallback)(const int, const bool);

因为我想让 p 比这更普遍。

mem_fn() 是正确的解决方案还是我离谱了?如果是这样,我应该如何在 valNamedFlags() 原型中声明回调?

或者我应该采取不同的方法?


实际上,正如一些人建议的那样,您在执行类似绑定的操作时会遇到问题,因为您的回调被定义为简单的函数指针,而不是可调用的。

如果你有能力的话,你可以改变你的

typedef void (*valNamedFlagsCallback)(const int, const bool);

类似的东西

typedef std::function<void(int, bool)> valNamedFlagsCallback

(还注意到const值参数不会影响函数的签名),那么您可以使用std::bind(),

using namespace std::placeholders;

pInstance->valNamedFlags(operand,
      "Statement types", 
      statementsSubscripts,
      statementsNames,
      std::bind(&E::setStatement, e, _1, _2));

或者你可以使用 lambda:

pInstance->valNamedFlags(operand,
  "Statement types", 
  statementsSubscripts,
  statementsNames,
  [&](int i, bool b) { e->setStatement(i, b); });

If you must将其保留为一个简单的函数,然后您必须发送一个引用正确对象作为全局/静态变量的函数。

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

如何在函数声明中声明 C++ mem_fn(member_function) ? 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • C# 和 Javascript SHA256 哈希的代码示例

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

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • 根据连续值之间的差异将列表拆分为子列表

    我有一个值列表 其中每个值至少有一个 但通常是多个 连续值 且增量为 0 033 l 26 051 26 084 26 117 26 15 26 183 31 146 31 183 34 477 34 51 34 543 我想将此列表拆分为
  • Java事件派发线程讲解

    我最近开始学习和探索 Java 中 GUI 编程的基础知识 编程已经有一段时间了 我只做过后端工作或工作 因此我最接近的用户界面是命令控制台 我知道这很尴尬 我正在使用 Swing 据我所知 这意味着我也在使用 AWT 我的问题是基于这段代
  • MySQL SELECT 中的条件 SELECT

    Table id price is active 1 20 99 0 2 10 99 1 3 30 99 0 4 15 99 1 5 35 99 1 我试图选择 is active 等于 1 的所有行的 COUNT 所以我使用了这个简单的查
  • 如何在Python中的多类分类问题上获取每个类的SHAP值

    我有以下数据框 import pandas as pd import random import xgboost import shap foo pd DataFrame id 1 2 3 4 5 6 7 8 9 10 var1 rando
  • 在 .ts 文件中使用 ngx-translate

    我想在侧菜单标题中使用翻译 我读过本教程 https ionicthemes com tutorials about internationalize and localize your ionic2 app with ngtranslat
  • 添加填充到谷歌地图bounds.contains()

    我有一个侧边栏 显示谷歌地图当前地图视图中的标记名称 侧边栏内容随着地图的移动而变化 google maps event addListener map bounds changed function document getElement
  • 相对路径如何在 Access 2007 中指定链接表?

    我有一个 Access 数据库的前端和后端 前端引用链接表 我需要进行相对链接而不是显式链接 即 database 被引用而不是 address database 是否可以这样做 或者我必须指定绝对路径 我已经尝试过上面的一些答案 尤其是马
  • 在 IE 8 中加速“:not”jQuery CSS 选择器?

    我在 IE 中遇到性能问题 并且正在执行一个包含以下选择器的大循环 td not some cell 在 IE 中是否有更有效的方法来做到这一点 IE8不支持 not选择器本身 所以如果您使用像 jQuery 内置的 Sizzle 这样的纯
  • 基于 Rails cookie 的会话:将会话范围与过期时间混合

    所以我以不同的方式问了这个问题here https stackoverflow com questions 14712968 session expiration not working in rails 14713390 14713390
  • 冒泡排序中的预期交换次数[重复]

    这个问题在这里已经有答案了 可能的重复 冒泡排序中的交换次数 https stackoverflow com questions 11331314 number of swaps in bubble sort 问题简述如下 给定一个数组 A
  • 调用网页的任务计划尽可能简单

    我有一个网页 它进行一些数据库更新 例如http www mysite com updates asp http www mysite com updates asp 我希望每天 09 00 自动调用此页面 我知道如何在IIS中安排任务 但
  • Azure AAD - 受众无效

    我创建了一个使用 azure Active Directory 保护的 Web api 我现在需要对此进行测试并尝试将 fiddler 与授权标头一起使用 我正在尝试使用以下代码生成令牌 Target obj Target cmbTarge
  • 如何处理无序拨打的“接听”电话?

    我有一个模拟销售漏斗的 WF4 服务 它的工作原理是从 注册 接收呼叫开始 之后 有 10 个类似的阶段 每个阶段包含 2 个接收 在当前阶段验证收到的数据之前 您无法前进到某个阶段 但我不确定的是 即使我的客户端应用程序不允许这样做 我怎
  • 如何使用实体框架使用序列在 Oracle 中插入标识值

    在 Oracle 数据库中 ID 列定义为数字 以及表的相应序列 如何确保 ID 列获取序列中的下一个值 using var db new MyOracleDb var user new User first name Abe last n
  • 服务器在渲染之前不会等到http调用完成 - Angular 4服务器端渲染

    我已经继续实现了角度通用 并且能够通过服务器端渲染来渲染 html 的静态部分 我面临的问题是 正在进行 API 调用 并且服务器正在渲染 html 而无需等待 http 调用完成 因此 我的模板依赖于从 api 调用获取的数据的部分不会在
  • 使用异步等待时无法获取对象的属性

    我正在使用 Node js 和 mongoose 但这个问题纯粹是关于async await部分 我写了这段代码 并且它有效 router get applications id async req res next gt var post
  • Hibernate 中的小写注释

    hibernate中有没有办法将实体的列注释为字符串小写 我的意思是例如 Entity public class User Column private String username 我希望休眠在所有未绑定到特定数据库的查询中将用户名转换
  • 如何在 gdb 中附加进程

    我有一个简单的 C 程序 它分叉一个进程 然后运行一个可执行文件 我想将子进程附加到 gdb 我在控制台中运行主程序并打开另一个控制台来查找子进程的 pid 然后使用以下命令启动 gdb gdb attach 12271 where 122
  • 不需要的空白导致列扭曲

    我正在尝试从间隔 非制表符 的 txt 文件导入化学品列表 NO FORMULA NAME CAS No A B C D TMIN TMAX code ngas TMIN ngas 25 C ngas TMAX 1 CBrClF2 brom
  • 如何在函数声明中声明 C++ mem_fn(member_function) ?

    我理解将成员函数的地址传递到类之外的基本问题 我感觉 mem fn 可能是解决方案 但我在具体细节上遇到了麻烦 我在类 p 中有一个成员函数 当前声明为 typedef void valNamedFlagsCallback const in