在C 中模擬實現boost bind的功能

2021-09-05 17:39:31 字數 866 閱讀 6079

接觸過boost的c++程式設計的朋友可能對boost::bind的印象比較深刻,通過它可以很容易的改變函式的引數個數,實現函式的委託封裝。在非同步程式設計中有著廣泛的應用。

在c#中卻沒有提供這一功能,然而,得益於c#強大而靈活的語法機制,我們可以用匿名函式很容易的模擬實現這一過程。

首先看一下如下三個函式:

static

int foo()

static

int foo1(int i)

static

int foo2(int i, int j)

對於這樣的三個函式,假如我們需要使用委託來呼叫它們,委託定義如下:

delegate

intfoohanlder(int x);

在一般情況下,這乙個委託只能呼叫foo1函式,如下所示:

foohanlder f1 = foo1;

在c++中,可以通過bind的封裝,使得foohanlder也能呼叫foo和foo2函式。偽**如下:

foohanlder f = bind(foo);

foohanlder f2 = bind(foo2, 3, _1);

雖然c#並不支援bind,我們卻可以用另外一種同樣優雅的方式實現同樣的效果:

foohanlder f = x => foo();

foohanlder f2 = x => foo2(3,x);

這裡其實就是通過c# lambda表示式對foo和foo2函式進行了一層封裝,構造乙個foohanlder形式的匿名函式,從而實現類似bind的功能。非常簡單易用。

ps:.net 2.0下可以通過匿名函式來實現同樣的效果,只不過可視性上比lambda表示式略差而已。

在Python中如何模擬實現指標

在python中模擬實現指標 因為python中的指標本身不存在,但並不意味著無法使用指標。實際上有多種方法可以在python中模擬指標。這裡用兩種方法來實現 使用可變型別作為指標 python中的變數 使用自定義python物件 python中的物件 使用可變型別作為指標 您已經了解了可變型別。因...

C 模擬實現List

雙向鍊錶 include includeusing namespace std typedef nodenode templatestruct node t data 鍊錶中的資料 node pnext 下乙個節點 node ppre 前乙個節點 templateclass list templat...

c 模擬實現堆

這次我們來模擬實現堆,首先堆是乙個完全二叉樹,每個元素都有乙個關鍵碼,儲存相應的資料,堆分為最大堆和最小堆。最大堆 最大堆任意乙個節點都大於它左右孩子的關鍵碼,堆頂元素最大。最小堆 最小堆任意乙個節點都小於它左右孩子的關鍵碼,堆頂元素最小。因此我們得出以下結論 堆儲存在下標為0開始計數的陣列中,因此...