我可以很容易地将成员函数绑定到std::function
,方法是用一个lambda表达式和capture子句 Package 它们。
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:'newline':无法从“int”转换为“Class ”
错误C2647:“.”:无法在“int”上解引用“void(__thiscall Class::*)(int)”
6条答案
按热度按时间nvbavucw1#
我认为根据C++11标准,这应该是支持的
实际上不是,因为非静态成员函数有一个隐式的第一个参数类型(cv限定)
YourType*
,所以在这种情况下它不匹配void(int)
。因此需要std::bind
:比如说,
编辑您提到这是要用同一个
Class
示例调用的。在这种情况下,你可以使用一个简单的非成员函数:然后
5cnsuln72#
根据Stephan T. Lavavej -“避免使用bind(),...,使用lambdas”。https://www.youtube.com/watch?v=zt7ThwVfap0&t=32m20s
在这种情况下:
idv4meu83#
可以使用
std::bind
:rekjcdws4#
在C++ 17中,你可以用途:
这是甜蜜的,特别是如果参数列表更长。当然成员函数的参数列表必须与
std::function
的参数列表兼容。xggvc2p65#
使用
std::function
和std::bind
,可以将不同的类成员函数视为相同的。ckx4rj1h6#
正如其他人已经说过的,您可以使用
std::bind
。语法是相当丑陋的。因此,我提供这些宏:下面是宏的一个示例实现,在第一次键入
std::function
以定义所需的签名(这也使其更容易阅读/使用)之后: