如何在这里正确使用绑定?

时间:2014-08-18 12:29:51

标签: c++

我无法弄清楚绑定成员函数的正确语法。 如果我有一个带有单个参数的函数的函数, 如何将对象传递给它?

在下面的例子中,传递函数的正确语法是什么?

#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));

3 个答案:

答案 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)