std::bind 结构内的成员函数
std::bind member function within struct
我有一个广泛适用的函数 bar
,而不是任何 struct
的成员。
bar
接受一个 functional/function 指针和一些其他参数。
我也有很多结构。它们在成员变量上是异构的。
在每个结构 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);
}
};
错误当然是:
: error: invalid use of non-static member function
一般情况下,不要使用std::bind()
。在极少数情况下,lambda 不会取代它,了解如何使用 std::bind()
到您永远不会感到惊讶的程度是一项巨大的投资。
std::bind()
是在 lambda 出现的同时从 boost
引入语言的,它可以处理一些 lambda 不能处理的极端情况。到今天,那些角落案例已经消失了。如果今天提出,将不会添加(尤其是当前形式)。
相反,学习如何使用 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);
}
我有一个广泛适用的函数 bar
,而不是任何 struct
的成员。
bar
接受一个 functional/function 指针和一些其他参数。
我也有很多结构。它们在成员变量上是异构的。
在每个结构 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);
}
};
错误当然是:
: error: invalid use of non-static member function
一般情况下,不要使用std::bind()
。在极少数情况下,lambda 不会取代它,了解如何使用 std::bind()
到您永远不会感到惊讶的程度是一项巨大的投资。
std::bind()
是在 lambda 出现的同时从 boost
引入语言的,它可以处理一些 lambda 不能处理的极端情况。到今天,那些角落案例已经消失了。如果今天提出,将不会添加(尤其是当前形式)。
相反,学习如何使用 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);
}