std::mem_fun
和 std::mem_fn
之间有什么区别?为什么命名如此令人困惑?
Boost的documentation表示在大多数情况下std::mem_fn
可以取代std::mem_fun
。那么在什么情况下你还会使用std::mem_fun
?
答案 0 :(得分:47)
std::mem_fun
已弃用。 std::mem_fn
可以做它所做的一切,而且它更方便。两者之间的关系与std::bind1st
/ std::bind2nd
和C ++ 11 std::bind
之间的关系相同。在std::mem_fn
和std::bind
制作成C ++ 98标准之后,std::bind1st
和std::mem_fun
都得到了开发和掌握。所以这意味着我们必须等到C ++ 11才能正确地用旧的替代品替换旧的东西。
例如,std::mem_fun
只能处理带有一个参数或没有参数的成员函数。 std::mem_fn
是可变参数,可以处理带有任意数量参数的成员。
您还需要在std::mem_fun
和std::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
的适应性仿函数的旧代码。