std::mem_fun 与 std::mem_fn
Posted
技术标签:
【中文标题】std::mem_fun 与 std::mem_fn【英文标题】:std::mem_fun vs std::mem_fn 【发布时间】:2012-07-25 17:15:24 【问题描述】:std::mem_fun
和 std::mem_fn
有什么区别?为什么命名如此混乱?
Boost 的documentation 表示std::mem_fn
在大多数情况下可以替换std::mem_fun
。那么在什么情况下你还会使用std::mem_fun
呢?
【问题讨论】:
【参考方案1】: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_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
作为 legacy。
*:我的意思是新代码不应该依赖于 C++03 协议,例如result_type
成员类型(更习惯于使用像 std::result_of
这样的新特性)——像 std::bind
/std::mem_fn
这样的新设施实际上确实提供了这些成员,如果它们在等效的 C++03 中存在的话代码。我让你来决定是否应该依靠这种行为来更新依赖于可适应函子的旧代码std::mem_fn
。
【讨论】:
std::not1
和 std::not2
仍然期待那些“适应性强”的 typedef。
@Cubbi:它们是 C++11 中唯一仍在使用的部分吗?
@Scotty 据我所见,是的,唯一未弃用的部分。并且有大约 25 种方法可以使用这些 typedef 创建函子,从 std::function
和 std::mem_fn
到 std::ref
和 std::map::value_comp
。以上是关于std::mem_fun 与 std::mem_fn的主要内容,如果未能解决你的问题,请参考以下文章