在C 中實現C 的delegate機制

2021-05-02 00:37:53 字數 2027 閱讀 5901

由於這段時間較忙,自從上次我發布了乙個供初學者學習的「mfc」程式後,就沒怎麼寫文章了。這段時間在忙新的專案,專案邏輯還算複雜,用了好多有閃光點的技術,下面我要討論的是閃光點之一:在c++中實現c#的delegate機制。

用過c#的朋友都覺得c#的確是個好語言,但有時由於特殊需要,不得不用c++,在c++中要想實現c#中的thread等也是可行的,不過**要稍複雜。

以例子來說明:

class   sdk 

; class client

void onmessage()

}

這個例子比較簡單,sdk用來實現某個功能,client是客戶程式,要想在m_sdk做處理的時候能傳送通知到client,有幾個方法可以實現, 其一是發執行緒訊息,其一是**,但傳統的**對物件導向的支援並不好,這就是實現delegate的出發點。 下面是乙個實現:

class   delegate 

virtual void operator()(void) = 0;

}; template class delegateimpl : public delegate

virtual void operator()(void)

};

有了上面**,再稍加修改sdk和client**就能實現事件通知了:

class   sdk 

void dosomething()

void dosomething()

void ondosomething()

/ virtual r operator()(void) = 0;/

};/ template/

class name##delegateimpl : public name##delegate/

/ virtual r operator()(void)/

/};/

template/

name##delegate* make##name##delegate(c* c, f f)/

////delegate 1

#define define_delegate(name, r, p1)/

class name##delegate/

/ virtual r operator()(p1 p1) = 0;/

};/ template/

class name##delegateimpl : public name##delegate/

/ virtual r operator()(p1 p1)/

/};/

template/

name##delegate* make##name##delegate(c* c, f f)/

////delegate 2

#define define_delegate(name, r, p1, p2)/

class name##delegate/

/ virtual r operator()(p1 p1, p2 p2) = 0;/

};/ template/

class name##delegateimpl : public name##delegate/

/ virtual r operator()(p1 p1, p2 p2)/

/};/

template/

name##delegate* make##name##delegate(c* c, f f)/

/*//

//sample

define_delegate(open, void, int, string)

class sdk

void open() };

class client

void open()

void onopen()

void onopen2(int t, string str) };

*/

C 中的委託 delegate

delegate,中文意為 委託 是c 中新引入的乙個概念。我個人的理解,delegate相當於c 中函式指標在oop程式設計下的封裝。delegate的用途,如同函式指標的功能一樣,是為了在類似啟動執行緒 通用庫中的高階函式 以及事件處理等場合中,把乙個方法,或者說函式,作為乙個引數來傳遞。del...

C 中的delegate 委託

委託是乙個類,它定義了方法的型別,使得可以將方法當作另乙個方法的引數來進行傳遞,這種將方法動態地賦給引數的做法,可以避免在程式中大量使用if else switch 語句,同時使得程式具有更好的可擴充套件性。我的理解 委託相當於就是乙個函式,它有某種功能,其變數是一種方法,通過委託能夠間接的呼叫該方...

C 中的delegate是什麼?

1.c 中的delegate是什麼,有什麼用?delegate是委託,類似於在c語言中的函式指標,類a的方法m給類b使用,在類b中可以呼叫方法m.這裡委託是吧方法作為引數傳遞。1.1delegate和函式指標的區別?函式指標只能指向靜態的函式,但是delegate修飾的函式既可以引用靜態函式,有可以...