日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

用boost.signal实现多播委托

發布時間:2025/3/13 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用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实现多播委托的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。