用boost.signal实现多播委托
使用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;
????}
?
轉載于:https://www.cnblogs.com/TianFang/archive/2013/02/04/2891623.html
總結
以上是生活随笔為你收集整理的用boost.signal实现多播委托的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Uva 11235
- 下一篇: 使用ScheduledThreadPoo