gpt4 book ai didi

c++ - 如何传递信号回调(使用 boost::bind)

转载 作者:行者123 更新时间:2023-11-28 00:48:52 24 4
gpt4 key购买 nike

我正在为 boost::signals2::signal 编写包装器以获得更简洁、更易于使用的界面。这是我想出的:

#include <boost/signals2.hpp>

// Wrapper class template for boost::signals2::signal
template<typename T>
class Signal {
typedef typename boost::signals2::signal<T> SignalType;
public:
// Trigger the signal
void operator() () { sig(); }

// Attach a listener
boost::signals2::connection operator+=(const typename SignalType::slot_type& slot)
{ return sig.connect(slot); }

private:
SignalType sig;
};

class ClassThatGeneratesEvents {
public:
void generateEvents(int n) {
while (n-- > 0) {
SomethingHappened();
}
}

Signal<void ()> SomethingHappened;
};

void func()
{
;
}

class ClassThatListensForEvents {
public:
ClassThatListensForEvents(ClassThatGeneratesEvents& ev) {
received_count = 0;

// This works
ev.SomethingHappened += func;

// This doesn't!
ev.SomethingHappened += bind(&ClassThatListensForEvents::event_handler, this, _1);
}

void event_handler() {
received_count++;
}

int received_count;
};

我不确定这是我能想到的最好的包装器接口(interface),而且让 SomethingHappened 成为公共(public)成员可能会有一些缺点。虽然我不介意听取您对此的意见,但这不是问题所在。

我想知道的是如何将回调传递给 += 运算符。正如我在 ClassThatListensForEvents 中所写,对函数的回调没有问题,但使用结果 bind 会产生大量难以阅读的模板编译器错误。

最佳答案

你的信号有一个 void() 签名,所以它不需要任何参数。您正在尝试分配一个带有一个参数的 boost::bind 对象(因为它使用 _1),这是不兼容的。因此你会得到一个错误。目前尚不清楚您期望 event_handlerev 参数从何而来。如果您绑定(bind)实际值而不是 _1,则签名将兼容。

关于c++ - 如何传递信号回调(使用 boost::bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15089060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com