首页 > 解决方案 > 结构内的 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);
    }
};

错误当然是:

: 错误:无效使用非静态成员函数

标签: c++c++11member-functions

解决方案


一般来说,不要使用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


推荐阅读