我可以轻松地将成员函数绑定(bind)到std::function,方法是使用带有capture子句的lambda表达式将它们包装起来。

class Class
{
    Class()
    {
        Register([=](int n){ Function(n); });
    }

    void Register(std::function<void(int)> Callback)
    {

    }

    void Function(int Number)
    {

    }
};

但是我想直接绑定(bind)它们,如下所示。
// ...
Register(&Class::Function);
// ...

我认为根据C++ 11标准,这应该得到支持。但是,在Visual Studio 11中,我得到了这些编译器错误。

最佳答案



并非如此,因为非静态成员函数具有类型为(cv限定)YourType*的隐式第一个参数,因此在这种情况下,它与void(int)不匹配。因此,需要 std::bind :

Register(std::bind(&Class::Function, PointerToSomeInstanceOfClass, _1));

例如
Class c;
using namespace std::placeholders; // for _1, _2 etc.
c.Register(std::bind(&Class::Function, &c, _1));

编辑您提到要使用相同的Class实例来调用它。在这种情况下,您可以使用一个简单的非成员函数:
void foo(int n)
{
  theClassInstance.Function(n);
}

然后
Class c;
c.Register(foo);

关于c++ - 如何将成员函数直接绑定(bind)到Visual Studio 11中的std::function?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17131768/

10-13 05:03