【发布时间】:2012-07-25 17:15:24
【问题描述】:
std::mem_fun 和 std::mem_fn 有什么区别?为什么命名如此混乱?
Boost 的documentation 表示std::mem_fn 在大多数情况下可以替换std::mem_fun。那么在什么情况下你还会使用std::mem_fun呢?
【问题讨论】:
标签: c++ c++11 std member-functions
std::mem_fun 和 std::mem_fn 有什么区别?为什么命名如此混乱?
Boost 的documentation 表示std::mem_fn 在大多数情况下可以替换std::mem_fun。那么在什么情况下你还会使用std::mem_fun呢?
【问题讨论】:
标签: c++ c++11 std member-functions
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。
std::function 和 std::mem_fn 到 std::ref 和 std::map::value_comp。