34

std::mem_fun和 和有什么不一样std::mem_fn?为什么命名如此混乱?

Boost 的文档说在大多数情况下std::mem_fn可以替换。std::mem_fun那么在什么情况下你还会使用std::mem_fun呢?

4

1 回答 1

52

std::mem_fun已弃用。std::mem_fn可以做它所做的一切,而且做起来更方便。两者的关系与std::bind1st/std::bind2nd和 C++11的关系相同std::bind。两者都是在 C++98 标准之后开发std::mem_fnstd::bind掌握的。所以这意味着我们必须等到 C++11 才能用更好的替代品正确地替换旧的东西。std::bind1ststd::mem_fun

例如,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,如它们将出现在等效的 C++03 代码中。我让你来决定是否应该通过依赖这种行为来更新依赖于可适应函子的旧代码。std::bindstd::mem_fnstd::mem_fn

于 2012-07-27T03:02:39.273 回答