C++用boost.signal实现多播委托
boost.signal提供了一个多播委托机制,通过它可以非常容易的实现观察者模式:
void print_sum(float x, float y){std::cout << "The sum is " << x+y << std::endl; }void print_product(float x, float y){std::cout << "The product is " << x*y << std::endl; }void print_difference(float x, float y){std::cout << "The difference is " << x-y << std::endl; }int main(){boost::signalsig; sig.connect(print_sum); sig.connect(print_product); sig.connect(print_difference); sig(5, 3); }
signal对象的使用方式非常简单,connect连接回调,disonnect去连接回调,()运算符执行所有回调。
连接成员函数 通过lambda表达式也可以非常容易的实现成员函数的连接:
struct A{int value; A(int value) : value(value) {}void Foo() { cout << "a has value of " << value << endl; }}; int main(){A a(123); boost::signalsig; sig.connect([&]() {a.Foo(); }); sig(); }
连接带返回值的函数 signal也支持带返回值的函数,和C#一样,只返回最后一个函数的返回值。
boost::signalsig; sig.connect([](){ return 1; }); sig.connect([](){ return 2; }); sig.connect([](){ return 3; }); cout << sig() << endl;
异常处理 signal的异常处理机制也和c#一样:遇到异常后停止执行,抛出异常。
sig.connect([](){ cout << "foo 1" << endl; }); sig.connect([](){ throw std::exception("foo 2 fail"); }); sig.connect([](){ cout << "foo 3" << endl; }); try{sig(); }catch (std::exception& error){cout << error.what() << endl; }
【C++用boost.signal实现多播委托】到此这篇关于C++用boost.signal实现多播委托的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- boost字符串处理函数format的用法
- pytorch|pytorch_lesson16.1 OpenCV索贝尔算子/拉普拉斯算子调用+pytorch中构建cnn+复现经典模型(LeNet5+AlexNet)
- 卷积神经网络概念及使用 PyTorch 简单实现
- 使用IDEA学习JSP代码第008课
- 使用IDEA学习JSP代码第007课
- 使用IDEA学习JSP代码第004课
- 使用IDEA学习JSP代码第006课
- 对数常用公式
- 5种在TypeScript中使用的类型保护
- Radius协议工作原理及双因素认证应用