本篇内容主要讲解“C++怎么用boost.signal实现多播委托”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“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::signal<void (float, float)> sig; 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::signal<void ()> sig; sig.connect([&]() {a.Foo();}); sig(); }
signal也支持带返回值的函数,和C#一样,只返回最后一个函数的返回值。
boost::signal<int ()> sig; 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实现多播委托”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。