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);
}