带有调用运算符的std :: bind on member

时间:2017-05-01 09:06:44

标签: c++ c++11

这可能是一件愚蠢而愚蠢的事情 - 但我想了解这里会发生什么。

我有以下代码:

#include <iostream>
#include <functional>

namespace
{
    struct call
    {
        void operator()() const
        {
            std::cout << "call::operator()" << std::endl;
        }
    };

    struct dummy
    {
        dummy() = default;
        dummy(const dummy&) = delete;

        call member;
    }; 
}

所以成员本质上可以像任何其他对象方法一样工作,允许它被调用为:

dummy d;
d.member()

哪个会打印call::operator()

现在我想使用bind来做到这一点,初始实现看起来像这样:

int main() 
{
    dummy d;

    auto b = std::bind(&dummy::member, &d);
    b();
    return 0;
}

编译,但没有打印。我真的不明白发生了什么 - 它编译的事实,但没有输出让我感到困惑:)当然,std::bind的肚子里面会发生一些魔法,但是什么?

以下是播放代码的链接: https://ideone.com/P81PND

2 个答案:

答案 0 :(得分:6)

目前,您的绑定会返回一个成员,因此b()d.member。 你必须在那上面调用operator():

b()(); // call::operator()

作为替代方案,您可以使用以下任何一种:

b = std::bind(&call::operator(), &d.member);
b = [&]() {d.member();};

答案 1 :(得分:0)

您也可以通过std::reference_wrapper致电。根本不需要bind

int main() 
{
    dummy d;

    auto b= std::cref(d.member);  // create reference wrapper
    b();
    return 0;
}