C++ 封装boost::signal和boost::bind
我现在有个问题。我试图将boost::signal和boost::bind封装到我自己的事件类中C++ 封装boost::signal和boost::bind,c++,boost,boost-bind,boost-signals,C++,Boost,Boost Bind,Boost Signals,我现在有个问题。我试图将boost::signal和boost::bind封装到我自己的事件类中 class MyEvent { private: boost::signal<void ()> Sig; public: void Subscribe(.........) { Sig.connect(boost:bind(.........); } void Raise() { Sig(); } }; classmyevent { 私人:
class MyEvent
{
private:
boost::signal<void ()> Sig;
public:
void Subscribe(.........)
{
Sig.connect(boost:bind(.........);
}
void Raise()
{
Sig();
}
};
classmyevent
{
私人:
boost::信号Sig;
公众:
无效认购(……)
{
信号连接(升压:绑定);
}
作废
{
Sig();
}
};
我试图在Subscribe函数的签名中传递函数指针,而visualstudio只是给出了一些错误提示。
我不知道如何编写Subscribe的签名以及将什么传递到boost::bind中,理想情况下,我将在Subscribe函数中使用boost::bind(&MyClass::MyHandler,&MyClassObject)
,并在外部调用它,就像MyEventObject.Subscribe(&MyClass::MyHandler,&MyClass)
。
有人能帮我填补这两个空白吗?你只需制作
Subscribe
一个模板:
#include <boost/signals2.hpp>
#include <boost/bind.hpp>
class MyEvent
{
private:
boost::signals2::signal<void ()> Sig;
public:
template<class SlotClass>
void Subscribe(void (SlotClass::*func)(), SlotClass *obj)
{
Sig.connect(boost::bind(func, obj));
}
void Raise()
{
Sig();
}
};
struct Test
{
void f()
{}
};
int main()
{
MyEvent myEvent;
Test test;
myEvent.Subscribe(&Test::f, &test); // test must outlive myEvent!
}
#包括
#包括
MyEvent类
{
私人:
boost::signals2::Sig信号;
公众:
模板
void订阅(void(SlotClass::*func)(),SlotClass*obj)
{
Sig.connect(boost::bind(func,obj));
}
作废
{
Sig();
}
};
结构测试
{
void f()
{}
};
int main()
{
MyEvent-MyEvent;
试验;
订阅(&Test::f,&Test);//测试必须比myEvent更有效!
}
但是请注意,这样的包装器对用户的限制非常大:使用原始的
信号
,他可以连接以各种方式创建的任何类型的可调用
,而使用您的包装器,他必须传递一个指向成员函数的指针和一个指向对象的指针。谢谢Igor。我的老板让我对其进行封装,以避免每次使用boost lib其中。我真的想公开它,因为使用boost更灵活:signal@cynric4sure你的意思是你需要从接口中消除boost?那么,请注意以下几点:1)你的类仍然在其定义中公开了boost::signals
(尽管它是私有的
)因此,用户的代码将取决于boost头文件。你可能想通过pImpl来隐藏它;2) 您不必使用指向成员函数的指针来限制用户!相反,接受任何可调用项,让用户使用std::bind
或任何他想要的东西来创建它。