我可以轻松地将成员函数绑定到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(使用前将#替换为@)