了解 std::function 和 std::bind

2024-01-08

我正在玩 std::function 和 std::bind ,我注意到一些不直观的东西,我想更好地理解它。

例如:

void fun()
{
}

void hun(std::string) 
{ 
}

int main()
{

   function<void(int)> g = &fun; //This fails as it should in my understanding.

   function<void(int)> f = std::bind(fun); //This works for reasons unknown to me     
   function<void(int, std::string)> h = std::bind(hun); //this doesn't work

return 0;
}

怎么可能绑定一个function<void(int)>到一个函数void()。 然后我可以调用 f(1) 并获取 fun()。 我想了解这是如何完成的。 深入了解 Microsoft Visual Studio 2012 的实现让我迷失在一大堆不可读的宏中。所以这就是我在这里问这个问题的原因。


如果您不使用参数占位符 (_1, _2, ...),然后传递给从返回的函数对象的任何参数std::bind将被丢弃。和:

std::function<void(int)> f = std::bind(fun, std::placeholders::_1);

正如预期的那样,我得到了一个(又长又难看的)错误。

对于对标准语感兴趣的人:

§20.8.9.1.2 [func.bind.bind]

template<class F, class... BoundArgs>
*unspecified* bind(F&& f, BoundArgs&&... bound_args);

p3 返回:转发调用包装器g具有弱结果类型(20.8.2)。的效果g(u1, u2, ..., uM)应该INVOKE(fd, v1, v2, ..., vN, result_of<FD cv (V1, V2, ..., VN)>::type), where cv代表cv- 资格赛g 以及绑定参数的值和类型v1, v2, ..., vN如下指定确定.

p10 绑定参数的值v1, v2, ..., vN以及它们对应的类型V1, V2, ..., VN 取决于类型TiD派生自调用bindcv-预选赛cv调用包装器的g如下:

  • if TiD is reference_wrapper<T>,参数是tid.get()及其类型Vi is T&;
  • 如果值is_bind_expression<TiD>::value is true,参数是tid(std::forward<Uj>(uj)...)及其类型Vi is result_of<TiD cv (Uj...)>::type;
  • 如果值j of is_placeholder<TiD>::value不为零,参数为std::forward<Uj>(uj)及其类型Vi is Uj&&;
  • 否则,值为tid及其类型Vi is TiD cv &.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 std::function 和 std::bind 的相关文章

随机推荐

  • 仅使用gunicorn、django 和whitenoise 如何为媒体提供服务?

    我的网站终于可以正常工作了 但在以下情况下无法提供媒体文件debug False我应该怎么办 我经历了地狱般的尝试让它与 nginx 一起工作本教程 https www digitalocean com community tutorial
  • 如何在 Bash 脚本中运行 sudo 命令?

    我想运行以下示例 bash 脚本 该脚本需要 sudo 密码才能执行命令 bin bash kinit needs sudo password vi hello txt 运行上述脚本时 它要求输入密码 我如何在命令本身中传递用户名和密码 或
  • 检查一个数是否能被3整除[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 编写代码来确定一个数字是否能被 3 整除 该函数的输入是single位 0 或 1 如果到目前为止收到的数字是可被 3 整除的数字的二进制表示形式 则
  • 如何动态找出具有自定义属性的所有方法

    我有一个简单的挑战 我动态地需要找出 C 中具有特定属性的所有方法 我将从另一个应用程序动态加载程序集 并且需要找出确切的方法 程序集如下所示 基础 dll Class Base testmethod public void method1
  • Twitter 以编程方式添加照片

    我为 Firefox 制作了裁剪屏幕截图和上传插件 我想带来一个允许用户发布图像的功能 手动 像人类一样 的过程是这样的 打开 twitter com 如果未登录 请告诉用户登录 点击 新推文 就完成了 Attach images by d
  • 比较两个 git 存储库(包括所有分支)

    我有同一个 git 存储库的两个分支 我想检查它们是否完全相同 因此可以安全地删除其中一个而不丢失任何信息 虽然我知道如何比较单个分支 但我想问是否有一种简单的方法来比较所有分支 标签等 最快的方法是添加第二个遥控器并比较输出git ls
  • 如何用 C++ 编写“meta if else if..”?

    我刚刚学习 C 元编程的基础知识 我认为很高兴看到其他人如何解决以下问题 另外 很高兴看到使用 Boost 元编程库的解决方案 因为我认为它们对我来说是黑暗的角落 那么问题来了 是否可以重写得更优雅呢 假设我们有以下结构 template
  • 如何使用 mocha 和 supertest 测试带有标头参数的 Express Rest api?

    我必须测试我的其余 api 某些路由需要用户身份验证令牌的 http 请求标头中的值 我已将有趣的业务逻辑分离为纯 JavaScript 代码 但我找不到方法来测试在 http 请求标头中需要令牌的路由 欢迎摩卡和 或超级测试的任何其他替代
  • Bootstrap 响应式输入表单字段

    我正在使用 input lg 使表单字段变大 我的期望是 当视口缩小时 引导程序默认小于 768px 表单字段会变小并采用正常设置 但事实并非如此 有任何想法吗 bootstrap 可以处理这种情况吗 UPDATE HTML
  • 为什么抽象类有虚函数表?

    关于this https stackoverflow com questions 2592438 does an abstact classes have a vtable post 对于使用 vtable 的实现 答案是 是的 通常 你
  • 三角形 - 三角形相交测试

    我想知道是否有一些教程或指南来理解和在 3D 环境中实现三角形 三角形相交测试 我不需要知道交叉点发生在哪里 只需要知道发生了交叉点 我本来打算按照理论 pdf 来实现它 但我很困惑 计算三角形 2 的平面方程 如果三角形 1 的所有点都在
  • Spring中@Valid注解表示什么?

    在下面的示例中 ScriptFile参数标有 Valid注解 什么是 Valid注释做什么 RequestMapping value scriptfile method RequestMethod POST public String cr
  • Shapely:字符串中的多边形?

    我保存了一些形状多边形的字符串表示 POLYGON 51 0 3 0 51 3 3 61 51 3 3 0 51 0 3 0 有没有一些快速的方法可以直接将其转换回 Polygon 类型 或者我是否需要手动解析字符串来创建 Polygon
  • 如何将双精度数组的数据帧转换为向量?

    我有以下数据帧 其中包含双精度数组 需要将其转换为向量才能将其传递给 ML 算法 谁能帮我这个 fList org apache spark sql DataFrame features array
  • sklearn Logistic 回归 ValueError: X 每个样本有 42 个特征;期待 1423

    我被困在试图解决一个问题 这就是我想做的 我想使用逻辑回归预测缺失值 Nan 分类值 这是我的代码 df 1 我的数据集仅在 Metier 功能中缺少值 我试图预测的缺少值 X train pd get dummies df 1 df 1
  • Google 日历 api 出现错误,例如“domain”:“global”、“reason”:“notFound”、“message”:“Not Found”

    我尝试从日历示例中获取事件列表here https developers google com calendar api v3 reference events list 无论我选择哪一处房产 使用时 我总是收到 404 未找到 错误 任何
  • 背景颜色阻碍 WPF UserControl 内容

    我有一个UserControl 在 XAML 中引用如下
  • 处理 SVN 与 Tortoise 中的冲突?

    每当出现合并冲突或类似问题时 它都会让我慢下来 有人可以向我解释如何强制解决冲突吗 例如 我的一个朋友对存储库中的文件进行了编辑并提交 当他这样做时 我已经重命名了该文件 并在我的工作副本上对其进行了许多编辑 当我去提交时 我明显得到了冲突
  • 如何允许在 WiX 刻录引导程序中选择 MSI 功能?

    我刚刚开始尝试使用 Burn 来尝试链接多个 MSI 文件 我使用的是 WiX v3 6 2705 0 链接正在工作 但我现在正在尝试让可选功能正常工作 我希望这只是将我的 MsiPackage 标签的 EnableFeatureSelec
  • 了解 std::function 和 std::bind

    我正在玩 std function 和 std bind 我注意到一些不直观的东西 我想更好地理解它 例如 void fun void hun std string int main function