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_funstd::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_fnstd::bind 都是在 std::bind1ststd::mem_fun 成为 C++98 标准之后开发和掌握的。所以这意味着我们必须等到 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 作为 legacy。

*:我的意思是新代码不应该依赖于 C++03 协议,例如result_type 成员类型(更习惯于使用像 std::result_of 这样的新特性)——像 std::bind/std::mem_fn 这样的新设施实际上确实提供了这些成员,如果它们在等效的 C++03 中存在的话代码。我让你来决定是否应该依靠这种行为来更新依赖于可适应函子的旧代码std::mem_fn

【讨论】:

std::not1std::not2 仍然期待那些“适应性强”的 typedef。 @Cubbi:它们是 C++11 中唯一仍在使用的部分吗? @Scotty 据我所见,是的,唯一未弃用的部分。并且有大约 25 种方法可以使用这些 typedef 创建函子,从 std::functionstd::mem_fnstd::refstd::map::value_comp

以上是关于std::mem_fun 与 std::mem_fn的主要内容,如果未能解决你的问题,请参考以下文章

LDAP 与 MYSQL .. JA-SIG CAS 与 LDAP 与 CAS 与 MySQL

python网络编程基础(线程与进程并行与并发同步与异步)

=与==&与&&| 与 || 的区别

与 0 进行比较与与某个值进行比较是不是更快?

三.工具与市场-债券与债务股票与公司

RESTfulREST 与 RESTful 理解与实践