C 函式介面卡

2021-09-08 20:34:53 字數 1058 閱讀 6836

1、考慮下面的需求,在乙個int的vector中,找出乙個比5的元素,容易想到的解決辦法,定義乙個方法物件,使用模板,如下:

vector::iterator iter = find_if(intvec.begin(),intvec.end(),finder(3));

2、分析

find_if的偽**如下:

for (; _first != _last; ++_first) }

return _last;

也就是說,第三個引數只要能夠執行 _pred(*_first) 就可以,也就是具備隱式介面_pred(*_first)。

方法物件finder(3) 滿足條件。

3、有沒有其他的辦法呢?

我們已經有了方法物件greater 用於比較兩個物件的大小,以及參照物,能不能使用greater呢?

這裡存在問題:greater接收兩個引數比較大小,而find_if的第三個引數具備隱式介面_pred(*_first),只接受乙個引數。

這就需要解決,greater接受兩個引數,把其中乙個引數(參照物)固定下來,轉化為只接受乙個引數的方法。這就是方法介面卡。

也就是說,對greater和已知的參照物提供一層封裝,對外只接受乙個引數,對內轉交給greater,來比較變數和參照物的大小。

4、**如下:

vector::iterator iter = find_if(intvec.begin(),intvec.end(),bind2nd(greater(),3));

greater() 是匿名的方法物件,bind2nd(greater(),3) 對匿名的方法物件和參照物進行封裝,產生乙個新的方法物件,對外置受乙個引數,對內轉交給greater,比較引數和參照物的大小。

5、注意:介面卡模式與**模式的區別,介面卡模式是客戶要求介面a,已存在的元件可以完成功能,但是沒有介面a,提供介面卡對元件封裝,對外暴露介面a,對內轉交給元件處理。對元件封裝,有兩種方式:private繼承(實現繼承)和關聯。private繼承叫做類介面卡,關聯叫做物件介面卡模式。而**模式是proxy和subject具備同樣的介面,proxy關聯subject,做的事情都轉交給subject。

STL介面卡 函式介面卡

有時候需要對內建函式物件返回值進行進一步的簡單計算,或者填上多餘的引數,不能直接代入演算法。函式介面卡實現了這一功能,函式介面卡是將一種函式物件轉化為另一種符合要求的函式物件。函式介面卡可以分為4個大類 繫結介面卡 組合介面卡 指標函式介面卡和成員函式介面卡。需求 在遍歷容器的時候,將容器中的值全部...

C 函式介面卡

2013年08月15日 09 10 04 1519人閱讀收藏 舉報c 深入學習 151 先弄清幾個概念,什麼叫一元函式,二元函式 1.一元函式乙個引數 2.二元函式 兩個引數 3.一元謂詞 乙個引數,返回型別為bool型 4.二元謂詞 兩個引數,返回型別為bool型 函式介面卡是用來讓乙個函式物件表...

C函式介面卡

普通變數可以通過指標進行訪問,用起來很方便,現在我有個想法,就是玩函式也要玩的這麼炫,我想給它寫個介面卡 這裡我主要是用可變引數和函式指標來實現,有兩個測試 片段 test1 和test2 其中test1用的是可變引數的函式指標,test2用的是巨集實現的函式介面卡。如下 1 2 file adap...