std :: mem_fun vs std :: mem_fn

Sco*_*tty 30 c++ std member-functions c++11

std::mem_fun和之间有什么区别std::mem_fn?为什么命名如此令人困惑?

Boost的文档说在大多数情况下std::mem_fn都可以替代std::mem_fun.那你在什么情况下仍会使用std::mem_fun

Luc*_*ton 47

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_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_fndo这样的新设施实际上提供了这些成员它们将存在于等效的C++ 03代码中.我留给你看看你是否应该std::mem_fn依靠这种行为来更新依赖于适应性仿函数的旧代码.

  • `std :: not1`和`std :: not2`仍然期望那些"适应性"的typedef. (2认同)