2010-07-20 124 views
4

我想为像lower_bound(...,Compare comp)这样的STL算法的“comp”参数提供成员函数。 comp()函数访问非静态成员字段,因此它本身必须是非静态成员,但非静态成员函数指针的类型与普通函数指针的类型不同。在C++中将“成员函数指针”转换为函数指针的最简单方法是什么?

解决此问题的最佳方法是什么?

+1

你想谷歌的词是“仿” – 2010-07-20 07:32:00

+0

或函数对象,或者用C++ 11,一个lambda /匿名函数:) – legends2k 2012-12-30 15:25:46

回答

7

这是最常见的使用std::mem_funstd::mem_fun_ref。它们是创建调用指定成员函数的函子的模板。 TR1增加了一个std::tr1::bind,这也是有用的和更通用的(如果你没有TR1可用,那是基于Boost::bind)。 C++ 0x将在标准库中包含std::bind(与TR1几乎没有变化)。

+0

mem_fun()仅适用于具有一个或没有参数的函数,而comp必须指向具有两个参数的函数。 Qt中有这个功能吗? – zoo 2010-07-20 06:30:30

+0

'mem_fun'也不能用于有参考参数的函数:(如果你使用'mem_fun_ref',然后尝试将它与'bind1st'或'bind2nd'结合起来,它会再次失败,因为它们已经被破坏了。完全变为'boost :: bind'和'boost :: function' – 2010-07-20 09:59:55

+0

对于那些迟到这个页面的人来说,像我一样:避免使用已经废弃的mem_fun和mem_fun_ref;切换到mem_fn。详细信息:* http://stackoverflow.com/questions/11680807/stdmem-fun-vs-stdmem-fn – legends2k 2012-12-30 15:24:27

6

这听起来像你想要类似boost::bind的东西,将成员函数指针绑定到该类的一个实例。

您是否愿意详细说明您的问题,以了解您要做什么?示例代码等?

+0

升压绑定绝对是最灵活的解决方案。 – StackedCrooked 2010-07-20 09:13:05

1
#include<tr1/functional> 

和使用的mem_fn()