微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

std::bind 结构中的成员函数

如何解决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 举报,一经查实,本站将立刻删除。