C++委托機制實現(xiàn)


title: C++實現(xiàn)委托機制

cplus11_feature_E

purpose

prproject is to introduce C++ 11 new feature which could promote development efficience and rubust

C++ 委托機制

在GUI編程或者基于事件開發(fā)的項目中,經(jīng)常需要使用回調(diào)函數(shù). 為了處理這類回調(diào)事件, C# 特別提供了關鍵字delegate來實現(xiàn).

函數(shù)指針回調(diào)做法

在傳統(tǒng)的C++開發(fā)過程中, 為了實現(xiàn)函數(shù)回調(diào),一般的做法是將 C++ 的函數(shù)指針傳給管理者.當有事件觸發(fā)時,再執(zhí)行該回調(diào)函數(shù).

基于函數(shù)指針的回調(diào)方式有一下缺點:

  • 對萌新不友好, 上手困難
  • 函數(shù)指針操作并不安全,無法在編譯階段檢測來

C++11 新特性

為了解決此類問題, C++11 從boost庫中借鑒了新特性 functional, 以此為容器存儲函數(shù)指針,從而優(yōu)雅的實現(xiàn)回調(diào)機制

案例演示:

  • 存儲自由函數(shù)
  • 存儲lambda表達式
  • 存儲std::bind 結(jié)果 (非常重要)
  • 存儲類成員方法和類實例
  • 存儲類成員方法和類實例指針
  • 存儲結(jié)構(gòu)體方法
#pragma once
#include <functional>
#include <iostream>

void print_num(int i);

inline void print_num(int i)
{
    std::cout << i << '\n';
}

struct PrintNum {
    void operator()(int i) const
    {
        std::cout << i << '\n';
    }
};

struct Foo {
    Foo(int num) : num_(num) {}
    void print_add(int i) const { std::cout << num_ + i << '\n'; }
    int num_;
};

void main();

inline void main()
{
     // store a free function
     std::function<void(int)> f_display = print_num;
     f_display(-9);

     // store a lambda
     std::function<void()> f_display_42 = []() { print_num(42); };
     f_display_42();

     //store the result of a call to std::bind
     std::function<void()> f_display_31337 = std::bind(print_num, 31337);
     f_display_31337();

     // //store a call to a member function
     //std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;
     const Foo foo(314159);
     //f_add_display(foo, 1);

     //store a call to a data member accessor
     //std::function<int(Foo const&)> f_num = &Foo::num_;
     //std::cout << "num_: " << f_num(foo) << '\n';

     // store a call to a member function and object
     using std::placeholders::_1;
     std::function<void(int)> f_add_display2 = std::bind(&Foo::print_add, foo, _1);
     f_add_display2(2);

     // store a call to a member function and object ptr
     std::function<void(int)> f_add_display3 = std::bind(&Foo::print_add, &foo, _1);
     f_add_display3(3);

     // store a call to a function object
     std::function<void(int)> f_display_obj = PrintNum();
     f_display_obj(18);
}

委托機制實現(xiàn)演示

class IObj
{
public:
    virtual int callback(string t_data) = 0;
};


class AppleObj : public IObj
{

public:
    virtual int callback(string t_data) final
    {
        cout << "this is  appleobj : "<<endl;
        return 0;
    }
};

class BananaObj : public IObj
{
public:
    virtual int callback( string t_data) final
    {   
        cout << "this is  banana object: " << endl;
        return 1;   
    }
};


class DeleManager
{
public:
    DeleManager() {};
    ~DeleManager() {};
    void addObj(function<int(string)> t_dele)
    {
        _dele_list.push_back(t_dele);
    }
    void notify(string t_msg)
    {
        if (_dele_list.empty())
        {
            cout << "list is empty " << endl;
            return;
        }

        for (auto itor : _dele_list)
        {
            itor(t_msg);
        }
    }

private:
    vector <function<int(string)>> _dele_list;
#pragma region MAIN
public:
    static void main()
    {
        DeleManager i_manager;
        AppleObj i_apple;
        BananaObj i_banana;
        using std::placeholders::_1;
        std::function<int(string)> i_dele_apple = std::bind(&AppleObj::callback, i_apple, _1);
        i_manager.addObj(i_dele_apple);
        std::function<int(string)> i_dele_banana = std::bind(&BananaObj::callback, i_banana, _1);
        i_manager.addObj(i_dele_banana);
        i_manager.notify("happy middle september day");
    }
#pragma endregion MAIN

};

windows消息回調(diào)

在windows GUI 開發(fā)過程中, 一般通過 postmessage 來完成消息回調(diào),觸發(fā)GUI執(zhí)行對應的操作. 這種方式簡單易行,對萌新友好,且具備跨線程操作的功能. 但是postmessage 也有自身的缺陷:

  • 過渡依賴windows消息機制
  • 回調(diào)傳參可定制程度低

總結(jié)

為了解決GUI 跨線程操作界面的導致主線程崩潰的情況, C++ 11 終于推出了自己的thread 類
thread 類提供detach() 的方法, 讓worker線程也具備了操作GUI的能力.
在GUI開發(fā)中, 通過使用functionthread等C++ 11 新特性,能夠更便捷的開發(fā)出高質(zhì)量的程序, 同時回避開發(fā)過程中的問題

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罚随,一起剝皮案震驚了整個濱河市牧抵,隨后出現(xiàn)的幾起案子更卒,更是在濱河造成了極大的恐慌,老刑警劉巖丙躏,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡骏全,警方通過查閱死者的電腦和手機与斤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門肪康,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人撩穿,你說我怎么就攤上這事磷支。” “怎么了食寡?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵雾狈,是天一觀的道長。 經(jīng)常有香客問我抵皱,道長善榛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任呻畸,我火速辦了婚禮移盆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伤为。我一直安慰自己咒循,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叙甸,像睡著了一般颖医。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚁署,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天便脊,我揣著相機與錄音,去河邊找鬼光戈。 笑死哪痰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的久妆。 我是一名探鬼主播晌杰,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼筷弦!你這毒婦竟也來了肋演?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤烂琴,失蹤者是張志新(化名)和其女友劉穎爹殊,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奸绷,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡梗夸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了号醉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片反症。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖畔派,靈堂內(nèi)的尸體忽然破棺而出铅碍,到底是詐尸還是另有隱情,我是刑警寧澤线椰,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布胞谈,位于F島的核電站,受9級特大地震影響憨愉,放射性物質(zhì)發(fā)生泄漏呜魄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一莱衩、第九天 我趴在偏房一處隱蔽的房頂上張望爵嗅。 院中可真熱鬧,春花似錦笨蚁、人聲如沸睹晒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伪很。三九已至戚啥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锉试,已是汗流浹背猫十。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呆盖,地道東北人拖云。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像应又,于是被迫代替她去往敵國和親宙项。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.面向?qū)ο蟮某绦蛟O計思想是什么株扛? 答:把數(shù)據(jù)結(jié)構(gòu)和對數(shù)據(jù)結(jié)構(gòu)進行操作的方法封裝形成一個個的對象尤筐。 2.什么是類?...
    少帥yangjie閱讀 5,005評論 0 14
  • 給兒子批改作業(yè)洞就,讓我這個周末“愉快”又充實盆繁。一個寒假未關注兒子的學習,于是旬蟋,開學無數(shù)“驚喜”來襲油昂! 首...
    Amanangel閱讀 413評論 0 1
  • ?九鳳朝凰:絕色獸妃逆天下?是作者路非創(chuàng)作的經(jīng)典玄幻小說躁染,強烈推薦! 女主角重葵架忌,前世是驚才絕艷吞彤、腹黑狡詐的魔鬼教...
    閱文墻閱讀 1,598評論 0 0
  • 定義: 網(wǎng)絡爬蟲(WebSpider),又被稱為網(wǎng)頁蜘蛛叹放,是一種按照一定的規(guī)則饰恕,自動地抓取網(wǎng)站信息的程序或者腳本。...
    帥帥滴小哥哥閱讀 285評論 0 0