C++ std::mem_fun vs std::mem_fn

C++ std::mem_fun vs std::mem_fn,c++,c++11,std,member-functions,C++,C++11,Std,Member Functions,std::mem\u fun和std::mem\u fn之间有什么区别?为什么命名如此混乱 Boost说在大多数情况下,std::mem_fn可以取代std::mem_fun。那么在什么情况下您仍然会使用std::mem_-fun?std::mem_-fun已被弃用std::mem_fn可以做任何事情,而且做起来更方便。两者之间的关系与std::bind1st/std::bind2nd和C++11std::bind之间的关系相同。std::mem_fn和std::bind都是在std::bind

std::mem\u fun
std::mem\u 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_fn
std::bind
都是在
std::bind1st
std::mem_fun
成为C++98标准后开发和掌握的。因此,这意味着我们必须等到C++11才能用更好的替代品正确地替换旧的东西

例如,
std::mem_-fun
只能处理带一个或不带参数的成员函数
std::mem_fn
是可变的,可以处理接受任意数量参数的成员

您还需要在
std::mem\u-fun
std::mem\u-fun\u-ref
之间进行选择,具体取决于您是要处理类对象的指针还是引用(分别)
std::mem_fn
可以单独处理这两种情况,甚至可以提供对智能指针的支持

boost::mem_fn
的文档解释了何时使用
std::mem_fun
,简单地说,就是当您需要使用期望
std::mem_fun
的代码,或者期望使用适应性函子(这是C++03中过时的概念*)的代码时。对于这些情况,您也无法插入
std::mem_fn
,因此您可以使用它:您将使用
std::mem_fun
作为遗留


*:我的意思是,新代码不应该依赖于C++03协议,例如拥有
result\u类型
成员类型(更习惯于使用
std::result\u of
)--像
std::bind
/
std::mem_fn
这样的新功能实际上提供了这些成员,如果它们以等效的C++03代码出现的话。我把它留给你们去弄清楚,你们是否应该通过依赖这种行为,用
std::mem\fn
来更新依赖适应性函子的旧代码。

std::not1
std::not2
仍然期望那些“适应性”类型定义。@Cubbi:它们是C++11中唯一仍然存在的部分吗?@Scotty,就我所见,是的,唯一未弃用的部件。使用这些typedef创建functor有25种方法,从
std::function
std::mem\u fn
std::ref
std::map::value\u comp