我可以轻松地将成员函数绑定(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/