具有不同签名的 std::function 向量

2024-04-26

我有许多具有不同签名的回调函数。理想情况下,我想将它们放入一个向量中,并根据某些条件调用适当的向量。

e.g.

void func1(const std::string& value);

void func2(const std::string& value, int min, int max);

const std::vector<std::function<void(std::string)>> functions
{
    func1,
    func2,
};

我意识到上述是不可能的,但我想知道是否有任何我应该考虑的替代方案。我还没有找到任何东西,我已经尝试过std::bind但没有达到我想要的目标。

这样的事可能吗?


你还没有说出你期望能够做什么func2将其放入错误类型的向量后。

您可以轻松使用std::bind如果您提前知道参数,请将其放入向量中:

const std::vector<std::function<void(std::string)>> functions
{
    func1,
    std::bind(func2, std::placeholders::_1, 5, 6)
};

Now functions[1]("foo")将会通知func2("foo", 5, 6),并且将通过5 and 6 to func2每次。

这是使用 lambda 而不是相同的事情std::bind

const std::vector<std::function<void(std::string)>> functions
{
    func1,
    [=](const std::string& s){ func2(s, func2_arg1, func2_arg2); }
};

如果您还不知道参数,可以将引用绑定到一些变量:

int func2_arg1 = 5;
int func2_arg2 = 6;
const std::vector<std::function<void(std::string)>> functions
{
    func1,
    std::bind(func2, std::placeholders::_1, std::ref(func2_arg1), std::ref(func2_arg2))
};

Now functions[1]("foo")将会通知func2("foo", func2_arg1, func2_arg2),并且您可以为整数分配新值以将不同的参数传递给func2.

并使用 lambda 函数代替std::bind

const std::vector<std::function<void(std::string)>> functions
{
    func1,
    [&](const std::string& s){ func2(s, func2_arg1, func2_arg2); }
};

但这很丑陋,因为你需要保留int只要引用它们的可调用对象(闭包或绑定表达式)存在,变量就会一直存在。

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

具有不同签名的 std::function 向量 的相关文章

随机推荐

  • UITableView的separatorEffect属性有什么用?

    iOS 8 中的新功能是separatorEffect属性 您可以为其分配 UIVisualEffect 有谁知道这是做什么用的吗 我试过了 但我不认为它有任何 呃 视觉效果 我想知道完全相同的事情 所以我放了一个Github https
  • random.seed():它有什么作用?

    我有点困惑什么random seed 在 Python 中是这样的 例如 为什么下面的试验会 一致地 做他们所做的事情 gt gt gt import random gt gt gt random seed 9001 gt gt gt ra
  • wxPython:在现有 wx.Panel 上覆盖 wx.Panel 的好方法

    我有一个 wx Frame 其中有一个主 wx Panel 其中有几个小部件 我想要其中的一个按钮来启动 帮助面板 这个帮助面板可能是一个wx Panel 我希望它覆盖整个主wx Panel 不包括wx Frame的菜单栏 帮助按钮上应该有
  • 如何在 HTML 文件中包含 python 脚本?

    我该如何放置这个Python脚本 a f d s a x 1 scope vars for i in a scope x 1 print a x html 文件里面 像这样 如果你想创建一个html 不一定显示它 html file ope
  • pygame中盒子的连续移动

    我编写了以下代码来创建一个简单的游戏 当您单击键盘上的箭头时 一个框会在游戏中移动一个单位 我试图做到这一点 以便如果我按下任何箭头按钮 盒子将继续朝该方向移动 直到按下另一个箭头 因此 如果我按一次向右箭头而不是快速移动 50 像素 它将
  • 如何使用 ES6 样式导入添加外部 javascript 库?

    我无法准确理解如何在新的 ES6 项目中使用旧的 javascript 库 我正在查看一个使用 webpack 编译 使用 ES6 编写并使用 Babel 转译的 React 项目 每个组件都遵循import from 符号 我想在项目中使
  • 类继承命名

    我想继承 DevExpress ComboBoxEdit 控件 并且想知道将我的类命名为与 DevExpress 类相同的名称是否是不好的做法 这是派生类声明 using System using System Collections Ge
  • 如何在 Jenkins Freestyle 项目中使用可锁定资源插件中的 Groovy 表达式

    这个问题是针对旧版本提出的可锁定资源插件 https wiki jenkins ci org display JENKINS Lockable Resources Plugin 旧版本中的错误自2 1版本以来已得到修复 然而 没有描述如何在
  • 使用 Buildbot 支持多个存储库

    目前 Buildbot 不支持多个存储库 如果需要这一点 则需要运行单独的 Buildbot 实例 我仍然很好奇是否有人想出了一个创造性的解决方法来让这个功能正常工作 Update 这个答案最近收到了一些反对票 请注意 这个答案适用于 20
  • 刚刚通过 NuGet 更新了 ImageResizer,无法运行应用程序,因为它找不到 BundleAttribute

    我只是想更新 Azure 存储 但这意味着我需要更新 ImageResizer AzureReader 并更新应用程序以使用 Net 4 5 2 Azure 站点设置为 Net 4 6 现在我已经拥有了最新版本的所有内容 我已经清理并重建了
  • Prismic - 如何在不暴露访问令牌的情况下进行 API 调用

    我正在构建一个 vue js Web 应用程序 我想对我的 prismic 存储库进行相应的调用 但我不知道如何在不暴露我的访问令牌的情况下执行此操作 我正在使用所示的其余 api 方法here https prismic io docs
  • 背景图像:如果图像很小,如何填充整个div,反之亦然

    我有三个问题 当我尝试在较小尺寸的 div 中使用背景图像时 div 仅显示图像的一部分 如何显示图像的完整或特定部分 我有一个较小的图像 我想在更大的 div 中使用 但不想使用重复功能 CSS 有什么方法可以控制图像的不透明度吗 调整图
  • 如何隐藏 Akka 远程 Actor 来查找?

    我正在运行 Akka 2 0 2 微内核 并希望为不受信任的远程参与者实现身份验证方案 首先想到的是设置一个身份验证参与者 当身份验证成功时 该参与者会返回对工作参与者的引用 但是 我应该如何保护工作参与者不被简单地通过 actorFor
  • R:使用 devtools 自动将 import(data.table) 添加到 NAMESPACE

    如何正确添加import data table to the NAMESPACE自动使用文件devtools 一般来说 如果我的包使用data table我只是手动写入 但是无法使用 export and devtools document
  • 在 p5.js 中放大时精灵模糊

    我试图将 p5 js 中精灵的大小放大一点 系数 2 但渲染时它们看起来很模糊 显然 放大通常不是一个好主意 但是我已经成功地使像素化精灵在原始 JavaScript 中看起来清晰 基于这篇文章 https nluqo github io
  • 谁能用适当的例子向我解释 1NF、2NF、3NF、BCNF 规则?

    这是一个常见的面试问题 我遇到过一次面试 面试官给了我一张桌子 让我告诉他这张桌子是哪种范式 如果它在 NF中 那么将其归一化到下一个NF 我总是对这些正常形式的数据库感到困惑 谁能向我解释这些范式 并举出每个 NF 如何建模到表中的正确示
  • 使用 Jacoco 从 Sonar 的条件覆盖范围中排除 groovy slf4j 日志记录

    我们使用 SonarQube 5 1 和 Jacoco maven 插件 0 7 4 以及我们所有的 slf4j 日志记录语句 例如log debug Something happened 表明仅覆盖了 2 个分支中的 1 个 我明白这是因
  • highcharter:突出显示组中的点

    使用时highcharter对于交互式绘图 如何指定组中的数据点必须一起突出显示 library highcharter library dplyr library tidyr dfr lt data frame sample c A B
  • oauth2client.client.AccessTokenRefreshError: invalid_grant 仅在 Docker 中

    我有相同的代码 具有相同的 p12 文件 检查了 md5 和 相同的 account email 和相同的范围 可以在多台计算机上工作 但不能在任何工作计算机上的 Docker 容器中工作 我的代码片段如下 with open self p
  • 具有不同签名的 std::function 向量

    我有许多具有不同签名的回调函数 理想情况下 我想将它们放入一个向量中 并根据某些条件调用适当的向量 e g void func1 const std string value void func2 const std string valu