如何解决std::bind 结构中的成员函数
我有一个广泛适用的函数 bar
,而不是任何 struct
的成员。
bar
接受一个函数/函数指针和一些其他参数。
我也有很多结构体。它们在成员变量上是异类的。
在每个结构 Foo
中,我希望 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 无法处理的极端情况。到今天,那些极端情况已经消失了。如果今天提出,它将不会被添加(尤其是在当前的形式中)。
相反,学习如何使用 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
。
成员函数参数的第一个(隐藏)参数是 this
变量。所以在这里使用 std::bind
的正确方法是
std::function<int(int)> wrapper = std::bind(&Foo::f1,this,_1,7);
然而,现代 C++,正确的做法是使用 lambda。我通常为此使用显式绑定,因此:
auto wrapper = [this](V v) {
return f1(v,7);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。