std :: mem_fun vs std :: mem_fn

时间:2012-07-27 02:49:04

标签: c++ c++11 std member-functions

std::mem_fun std::mem_fn 之间有什么区别?为什么命名如此令人困惑?

Boost的documentation表示在大多数情况下std::mem_fn可以取代std::mem_fun。那么在什么情况下你还会使用std::mem_fun

1 个答案:

答案 0 :(得分:47)

std::mem_fun已弃用。 std::mem_fn可以做它所做的一切,而且它更方便。两者之间的关系与std::bind1st / std::bind2nd和C ++ 11 std::bind之间的关系相同。在std::mem_fnstd::bind制作成C ++ 98标准之后,std::bind1ststd::mem_fun都得到了开发和掌握。所以这意味着我们必须等到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的适应性仿函数的旧代码。