2012-07-27 80 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

相关问题