我有以下情况,(代码更好)
class Foo
{
private:
typedef boost::signal<void ()> Signal;
Signal signal;
public:
void Register_SignalFunction(const Signal::slot_type& slot);
void Unregister_SignalFunction(const Signal::slog_type& slot);
}
class OtherFoo
{
Foo foo;
public:
OtherFoo()
{
foo.Register_SignalFunction(&OnSignal) //I know I can't do this that is precisely my question.
}
void OnSignal(); //what to do when signal fires
}
所以问题是,我如何将'member-function'指针传递给Register方法。还有,这样可以吗?我想要/需要的是某种代表注册系统,所以如果没有人能指出我正确的方向,我会很感激。提前完成。
答案 0 :(得分:3)
您通常会使用boost bind:
foo.Register_SignalFunction(boost :: bind(&amp; OtherFoo :: OnSignal,this));
这里发生了什么? : - )
信号的连接方法需要一个仿函数。这是一个实现()运算符的对象。 bind接受函数指针(释放函数或成员函数)并返回带有正确签名的仿函数。
另见:
Complete example using Boost::Signals for C++ Eventing
在这里:
how boost::function and boost::bind work
断开信号存储将连接的返回值存储到:
boost::signals::connection
然后调用disconnect方法。
答案 1 :(得分:1)
通常你会这样做:
void Register_SignalFunction(const boost::function<void()> &slot) {
signal += slot;
}
或者,作为内联函数:
template<typename T>
void Register_SignalFunction(T &slot) {
signal += slot;
}
通过删除间接层boost::function
,后者可能会稍微提高效率 - 但只假设boost::signal
内部不使用boost::function
(可能是这样)。所以,请使用您喜欢的任何一个。
答案 2 :(得分:0)
经过多次尝试后我才开始工作,这是代码:
GraphicsDeviceManager
{
private:
typedef boost::signal<void ()> DeviceLost;
DeviceLost deviceLost;
public:
Register_DeviceLostHandler(const boost::function<void ()> &handler)
{
deviceLost.connect(slot);
}
Unregister_DeviceLostHandler(const boost::function<void ()> &handler)
{
//deviceLost.disconnect(slot);
}
}
class GameBase
{
private:
GraphicsDeviceManager* graphics;
public:
GameBase()
{
graphics = new GraphicsDeviceManager();
graphics->Register_DeviceLostHandler(boost::bind(&GameBase::OnDeviceLost, this));
}
void OnDeviceLost()
{
//do some stuff
}
}
这个代码应该是这样的,有一个例外,如果我取消注释deviceLost.disconnect(handler)语句,我会收到编译错误,如: 错误C266“boost :: operator ==”:4次重载有类似的转换。
那么,为什么会这样呢?你知道其他任何方法来完成我正在尝试的事情吗?
答案 3 :(得分:0)
如果有人想要一个完整的例子:
#include <iostream>
#include <boost/signals2/signal.hpp>
#include <boost/bind.hpp>
#include <boost/optional/optional_io.hpp>
#define registerEvent_(A) registerEvent(boost::bind(A, this, _1, _2))
struct A
{
typedef boost::signals2::signal<int (int &, int &)> EventSignal;
typedef EventSignal::slot_type SlotType;
void registerEvent(const SlotType & slot);
void triggerAll(int& a1, int& a2);
EventSignal signal_;
};
void A::registerEvent(const SlotType & slot) { signal_.connect(slot); }
void A::triggerAll(int& a1, int& a2) {std::cout << signal_(a1, a2) << "\n";}
struct B : public A
{
B();
int myFunc(int& a1, int& a2);
};
B::B() {
#ifdef WITHMACRO
registerEvent_(&B::myFunc);
#else
registerEvent(boost::bind(&B::myFunc, this, _1, _2));
#endif
}
int B::myFunc(int& a1, int& a2) { return a1 + a2 + 1; }
int main()
{
int a1 = 2;
int a2 = 3;
B b;
b.triggerAll(a1, a2);
}