Encapsulating boost::signal and boost::bind
Encapsulating boost::signal and boost::bind
我现在有一个问题。我正在尝试将boost::signal和boost::bind封装到我自己的Event类中。
class MyEvent
{
private:
boost::signal<void ()> Sig;
public:
void Subscribe(.........)
{
Sig.connect(boost:bind(.........);
}
void Raise()
{
Sig();
}
};
我尝试在订阅函数的签名和visual studio中传递函数指针,只是给了我错误的音调。我不知道如何写订阅的签名和传递到boost::bind的内容,理想情况下,我将在订阅函数中有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!
}
注意,这样的包装器限制了它的用户:在原始的signal
中,他可以连接以各种方式创建的任何类型的callable
,而在你的包装器中,他必须传递一个指向成员函数的指针和一个指向对象的指针。
相关文章:
- boost::bind()类似的东西,但用于函数调用
- 泛化传递给 boost::bind 的参数
- boost::bind函数缓冲区的最大大小
- 自 1.55 以来,boost::bind / boost::function 中的奇怪行为变化
- 使用 boost::bind 进行订阅回调时出错
- 如何使用 boost::bind 附加参数?
- boost::bind 无法绑定到纯虚拟基类中定义的非静态函数模板成员类型
- 如何正确绑定成员函数与 boost::bind
- 将 boost::function 和 boost::bind 替换为模板
- Boost Asio - boost::bind 导致程序崩溃
- 我可以使用 boost::bind 来存储不相关的对象吗?
- 在spirit parser Action中,在上下文参数上编译boost :: bind(成员函数)上的错误
- 如何使用 boost::bind 将返回 int 的函数转换为返回布尔值的函数
- boost::bind with member functions(作为boost::asio异步写入处理程序)
- 创建一个 boost::线程 带有 boost::bind() 或不带
- 如何使用 boost::bind 将静态成员函数绑定到 boost::function
- 为什么这"boost::bind"不编译?
- 访问Boost Bind时,共享库中的C 符号查找错误
- 使用 Boost.Bind 打印矢量元素
- 编译 Boost.Bind时出错