c++ - 结构内的 std::bind 成员函数
问题描述
我有一个bar
广泛适用的功能,而不是任何struct
.
bar
接受一个函数/函数指针和一些其他参数。
我也有很多结构。它们在成员变量中是异构的。
在每个 structFoo
中,我希望Foo
调用 的成员函数,以便bar
提供给的函数bar
是 的另一个非静态成员函数Foo
。
SO 上的许多帖子都std::bind
与成员函数相关,但它们似乎略有不同。
#include <functional>
using namespace std;
typedef vector<int> V;
V bar(function<int(V)> f , V a) {
// do work.
}
struct Foo
{
V x;
int f1(V y , int z) {
// do work that involves member variable x,
// and inputs y, z.
}
int f2() {
std::function<V(int)> wrapper = std::bind(f1 , _1 , 7);
V a;
V c = bar(wrapper , a);
return accumulate(c.begin(),c.end(),0);
}
};
错误当然是:
: 错误:无效使用非静态成员函数
解决方案
一般来说,不要使用std::bind()
. 在极少数情况下 lambda 不会替换它,并且了解如何使用std::bind()
到您从不会感到惊讶的地步是一项巨大的投资。
std::bind()
与 lambdas 是同时被引入到语言boost
中的,它可以处理 lambdas 无法处理的一些极端情况。到今天,那些极端案例已经消失了。如果今天提出,将不会添加(尤其是当前形式)。
相反,学习如何使用 lambdas。Lambda 与 Lambda 一样难以完全掌握std::bind()
,但如今更加强大和有用。所以学会使用更好的选择。
int f2() {
V a;
V c = bar([&](V in){return f(v, 7);}, a);
return accumulate(c.begin(),c.end(),0);
}
这种特殊模式依赖于在调用之后bar
不存储。std::function
推荐阅读
- django - 使用 timezone.now() 获取本地时间
- javascript - 如何在 Vue.js 插槽中使用条件渲染?
- javascript - 如何从 React 中的父类更新我的子组件状态?
- flutter - 第 26 行 pos 14: 'url != null': 不正确
- javascript - 按钮未在 HTML 和 JavaScript 中单击
- sql - 我可以在 oracle 的一个联合子句中使用不同的提示吗
- c# - 如何让我流畅的第三人称动作不再抖动?
- node.js - Electron 应用程序渲染器进程在加载新的 html 页面时崩溃
- sass - 引用 SCSS 中元素的父级
- discord - TypeError:无法读取未定义的属性“fetchMembers”