簡體   English   中英

std :: mem_fun vs std :: mem_fn

[英]std::mem_fun vs std::mem_fn

std::mem_funstd::mem_fn什么區別? 為什么命名如此令人困惑?

Boost的文檔std::mem_fn在大多數情況下可以替換std::mem_fun 那么在什么情況下你還會使用std::mem_fun

不推薦使用std::mem_fun std::mem_fn可以完成它所做的一切,而且它更方便。 兩者之間的關系與std::bind1st / std::bind2nd和C ++ 11 std::bind之間的關系相同。 std::mem_fnstd::bind都是在std::bind1ststd::mem_fun被制作成C ++ 98標准之后開發和掌握的。 所以這意味着我們必須等到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::bind / std::mem_fn確實提供了那些成員,如果它們存在於等效的C ++ 03代碼中。 我留給你看看你是否應該依靠這種行為來更新依賴於std::mem_fn的自適應函子的舊代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM