这可能是一件愚蠢而愚蠢的事情 - 但我想了解这里会发生什么。
我有以下代码:
#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
答案 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;
}