巧妙使用std mem fun

2021-04-12 17:04:23 字數 1765 閱讀 6876

例如:假設有如下的**:

class employee

}std::vectoremps;

假設我們要呼叫emps裡面所包含的所有employee的dosomething();一般初學者會這樣呼叫:

for (std::vector::iteror it=emps.begin(); it!=emps.ends(); it++)

而定義乙個全域性的仿函式,使用stl中的for_each的用法也是司空見慣的,如:

int givedosomething(employee& e)

std::for_each(emps.begin(),emps.end(),&givedosomething);

但是這種訪問方式需要單獨定義乙個全域性的仿函式givedosomething.而有沒有辦法直接呼叫employee中對應的成員函式的話?答案是這樣子:

std::vectoremps;

std::for_each(emps.begin(),emps.end(),std::mem_fun_ref(&employee::dosomething));

而倘若容器中包含的是指向物件的指標,你就應該使用mem_fun:

std::vectoremp_ptrs;

std::for_each(emp_ptrs.begin(),emp_ptrs.end(),std::mem_fun(&employee::dosomething));

不過有一點要注意,請看dosomething函式是無參的,而對於有乙個引數的函式,可以使用std::bind...輔助函式,使用原則和mem_fun一樣。然而遺憾的是,這種做法不適應那些接受兩個或多個引數的函式,但是這並不代表mem_fun一無用處。

但是mem_fun這些特質同樣會帶給我們一些尷尬的事情,例:

std::mem_fun(&(std::vector::clear))

std::vector::clear()的函式引數是無參的,返回void.這樣呼叫會成功嗎?

c++標準裡面關於標準庫的部分在描述某些成員函式的實現時故意留了一些餘地。尤其是下面這兩句話:

1.乙個具有預設引數的成員函式簽名可以被「兩個或多個具有等價行為的成員函式簽名」所替代

2.成員函式簽名可以具有額外的預設引數

上面的第二句話就是問題所在,即那些可有可無,若隱若現的額外引數就是肇事者,herb sutter稱之為(peekaboo(一種類似捉迷藏的遊戲)引數).

大多數時候,那些由實現定認的額外的預設peekaboo引數根本不會引起人們的注意。例如,當你呼叫乙個成員函式的時候,那些peekaboo引數會繫結到它們的預設值,因而平常你根本不用去關心標準庫是否為這些函式新增了一些額外的形參。這樣的話,當你不得不知道某個成員函式的確切簽名時,這些可能的額外形參就成了大問題!假設你使用了mem_fun的時候。注意,即便你的編譯器能夠正確地推導出模板實參也無濟於事,這是因為兩個潛在問題:

1.如果有問題的成員函式實際上具有乙個帶預設值的形參,而你又不期望出現這個形參的話,你就使用像std::bind2nd這樣的設施對付它。但是你這樣做了之後,你的**移植到另乙個平台上,而該平台上的標準庫中相應的成員函式卻具有乙個不同型別的額外形參,或者根本沒有額外的形參,那麼你的**同樣無法工作。就是說,你的**本來就是不可移植的.

2.如果有問題的成員函式實現上具有兩個或多個形參,就根本無法將mem_fun用在自身上。

還有乙個最基本的問題:mem_fun裡面畢竟是要帶入乙個函式指標,我們不可能可移植地建立乙個指向標準庫里的成員函式的指標。

切記:mem_fun可以可移植地復用到你的任何**中,只要你願意,但是它卻不能可移植地復用到標準庫自身。

php巧妙使用 符

php中,變數實際分為兩部分,一部分為變數名,另一部分為變數內容.對變數而言,符使得不同的名字的變數訪問同乙個變數內容,這裡的名字指的是變數名,注意函式其實也是變數,同時 符號也經常作為一種位運算子參與運算,以下為工作中遇到的巧妙使用 符的場景,本文會持續跟新.變數篇 1.使用 符優化foreach...

Altium Designer 巧妙使用複製參考點

每日一點 巧妙使用複製參考點 內容可以通過上面的鏈結到我的部落格檢視哦 繪製封裝時,對於一些封裝我們需要進行陣列貼上,但是對於一些數量少的陣列,如三個焊盤,我們可以直接利用貼上偏移實現 首先以原點複製第乙個焊盤並貼上在原點 選中乙個焊盤向下偏移1mm,並修改標識為2 那麼對於第三個焊盤我們就不需要重...

使用flashback query巧妙抽取指定資料

在生產環境中存在著大量的資料,和業務是密切相關的。比如系統中的某個業務流程出現了問題,如果想復現就會顯得非常困難,甚至是不太可能的,比如電信系統中存在著大量的客戶資訊,相關聯的表的資料量都基本在千萬,億級。如果要抽取,是全量抽取還是增量抽取。全量抽取可行,但是實際操作起來也不現實,如果要在測試環境中...