std :: mem_fun和std :: mem_fn有什么区别?为什么命名很混乱?std :: mem_fun vs std :: mem_fn
Boost的documentation表示在大多数情况下std :: mem_fn可以代替std :: mem_fun。那么在什么情况下你仍然会使用std :: mem_fun?
std :: mem_fun和std :: mem_fn有什么区别?为什么命名很混乱?std :: mem_fun vs std :: mem_fn
Boost的documentation表示在大多数情况下std :: mem_fn可以代替std :: mem_fun。那么在什么情况下你仍然会使用std :: mem_fun?
std::mem_fun
已弃用。 std::mem_fn
可以做它所做的一切,它更方便。这两者之间的关系与std::bind1st
/std::bind2nd
和C++ 11 std::bind
之间的关系相同。在std::bind1st
和std::mem_fun
被制成C++ 98标准之后,开发并掌握了std::mem_fn
和std::bind
。所以这意味着我们必须等到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
。
'std :: not1'和'std :: not2'仍然期望那些“adaptable”typedefs。 – Cubbi 2012-07-27 03:46:59
@Cubbi:它们仍然是C++ 11的唯一部分吗? – Scotty 2012-07-27 05:56:20
@Scotty据我所见,是的,唯一没有被弃用的部分。并且有大约25种方法可以使用这些typedef创建函数,从std :: function和std :: mem_fn到std :: ref和std :: map :: value_comp。 – Cubbi 2012-07-27 14:55:31