2012-07-27 167 views
25

std :: mem_funstd :: mem_fn有什麼區別?爲什麼命名很混亂?std :: mem_fun vs std :: mem_fn

Boost的documentation表示在大多數情況下std :: mem_fn可以代替std :: mem_fun。那麼在什麼情況下你仍然會使用std :: mem_fun?

回答

40

std::mem_fun已棄用。 std::mem_fn可以做它所做的一切,它更方便。這兩者之間的關係與std::bind1st/std::bind2nd和C++ 11 std::bind之間的關係相同。在std::bind1ststd::mem_fun被製成C++ 98標準之後,開發並掌握了std::mem_fnstd::bind。所以這意味着我們必須等到C++ 11才能用上級替代方法正確替換舊的東西。

例如,std::mem_fun只能處理帶有一個或沒有參數的成員函數。 std::mem_fn是可變參數,可以處理具有任意數量參數的成員。

您還需要在std::mem_funstd::mem_fun_ref之間進行選擇,具體取決於您是要處理類對象(分別)的指針還是引用。單獨可以處理std::mem_fn,甚至可以提供對智能指針的支持。

boost::mem_fn文檔說明時使用std::mem_fun,並把簡單的,這時候你需要與期望std::mem_fun代碼來操作,或者預計適應仿函數(這是一個過時的概念*從C++ 03)。對於這些情況,您將無法插入std::mem_fn,因此您擁有它:您將使用std::mem_fun作爲遺產。 *:我的意思是說新代碼不應該依賴C++ 03協議,例如, result_type成員類型(更習慣於使用像std::result_of這樣的新特徵) - 像std::bind/std::mem_fn這樣的新工具確實爲那些成員提供了它們是否會出現在等效的C++ 03代碼中。我把它留給你來弄清楚你是否應該依靠這種行爲更新依賴於可修改仿函數的舊代碼與std::mem_fn

+2

'std :: not1'和'std :: not2'仍然期望那些「adaptable」typedefs。 – Cubbi 2012-07-27 03:46:59

+0

@Cubbi:它們仍然是C++ 11的唯一部分嗎? – Scotty 2012-07-27 05:56:20

+1

@Scotty據我所見,是的,唯一沒有被棄用的部分。並且有大約25種方法可以使用這些typedef創建函數,從std :: function和std :: mem_fn到std :: ref和std :: map :: value_comp。 – Cubbi 2012-07-27 14:55:31

相關問題