我无法弄清楚绑定成员函数的正确语法。 如果我有一个带有单个参数的函数的函数, 如何将对象传递给它?
在下面的例子中,传递函数的正确语法是什么?
#include <iostream>
#include <functional>
void caller(std::function<void(int)> f)
{
f(42);
}
class foo
{
public:
void f(int x)
{
std::cout<<x<<std::endl;
}
};
int main()
{
foo obj;
caller(std::bind(&foo::f,obj));
//^Wrong
}
错误是:
a.cpp: In function ‘int main()’:
a.cpp:18:34: error: could not convert ‘std::bind(_Func&&, _BoundArgs&& ...) [with _Func = void (foo::*)(int); _BoundArgs = {foo&}; typename std::_Bind_helper<std::__or_<std::is_integral<typename std::decay<_Tp>::type>, std::is_enum<typename std::decay<_Tp>::type> >::value, _Func, _BoundArgs ...>::type = std::_Bind<std::_Mem_fn<void (foo::*)(int)>(foo)>]((* & obj))’ from ‘std::_Bind_helper<false, void (foo::*)(int), foo&>::type {aka std::_Bind<std::_Mem_fn<void (foo::*)(int)>(foo)>}’ to ‘std::function<void(int)>’
caller(std::bind(&foo::f,obj));
答案 0 :(得分:3)
成员函数有一个隐含的第一个参数,即this
点。您需要将作为指针发送给它;您还需要int
参数的占位符。所以:
caller(std::bind(&foo::f, &obj, std::placeholders::_1));
// ^ ^^^^^^^^^^^^^^^^^^^^^^^
答案 1 :(得分:3)
占位符创建了一个&#34;空间&#34;对于稍后要绑定的实际参数:
int main()
{
foo obj;
caller(std::bind(&foo::f, &obj, std::placeholders::_1));
// ^ placeholder
// ^ address or even foo()
}
需要这些placeholders才能正确生成std::bind
结果的适当签名,以便绑定到std::function<void(int)>
。
您可能还想使用对象的地址,或std::ref
(因此无法复制);这将取决于你想要的语义。
答案 2 :(得分:1)
您需要指定创建的函数对象使用占位符获取参数:
std::bind(&foo::f,obj, std::placeholders::_1)