我已经使用 std::bind 创建了一个涉及类成员函数的 lambda,但 boost::signals2 不会接受它。
我有课Cut
当有新的 Event
时我想通知您调用void Cut::newEvent(Event& e)
查看.
我创建了一个与 Cut 实例的 lambda 绑定(bind),当我向它传递一个 Event 时,它会按预期工作。 (代码编译并输出“Registered new event”。)
但是,当我尝试将此 lambda 连接到 boost::signals2::signal<void(Event&)>
的实例时它提示以下消息:
error: 'f' cannot be used as a function
这很奇怪,因为我可以将它用作 main() 中的函数。 (如果我使用 std::function<void(Event&)>
而不是 auto,我会得到相同的结果。
有可能实现这个功能吗?为什么目前不起作用?
这是相关代码:
#include <iostream>
#include <boost/signals2.hpp>
//Dummy event class
struct Event
{ int val; };
typedef boost::signals2::signal<void (Event&) >
EventBroadcaster;
//Class I want to notified of new events
class Cut
{
public:
void newEvent( Event& e)
{
std::cout << "Registered new event" << std::endl;
fResult = true;
}
bool check() const
{ return fResult; }
private:
bool fResult;
};
int main()
{
Cut c{};
//Lambda to call newEvent on c
auto f =
std::bind( &Cut::newEvent, &c,
std::placeholders::_1) ;
Event e{};
f(e); //works
EventBroadcaster eb;
eb.connect(&f); //doesn't work
}
最佳答案
你应该使用
eb.connect(f);
因为f
是可调用函数对象,但&f
不可调用。
关于c++ - boost::signals2 的绑定(bind)类成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17809957/