如何在 Visual Studio 11 中直接将成员函数绑定到 std::function?

2024-05-10

我可以轻松地将成员函数绑定到std::function通过使用带有 capture 子句的 lambda 表达式来包装它们。

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

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

    }

    void Function(int Number)
    {

    }
};

但我想直接绑定它们,如下所示。

// ...
Register(&Class::Function);
// ...

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

错误 C2440:“换行符”:无法从“int”转换为“Class *”

错误 C2647: '.*' : 无法取消引用 'int' 上的 'void (__thiscall Class::* )(int)'


我认为根据C++11标准,应该支持这个

并非如此,因为非静态成员函数具有隐式类型的第一个参数(cv 限定)YourType*,所以在这种情况下它不匹配void(int)。因此需要std::bind http://en.cppreference.com/w/cpp/utility/functional/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));

Edit你提到这是用相同的方式调用的Class实例。在这种情况下,您可以使用一个简单的非成员函数:

void foo(int n)
{
  theClassInstance.Function(n);
}

then

Class c;
c.Register(foo);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Visual Studio 11 中直接将成员函数绑定到 std::function? 的相关文章

随机推荐