这里有很好的描述如何通过指针调用成员函数: http://www.newty.de/fpt/functor.html
但是仿函数需要得到2个参数:指向对象的指针和指向成员函数的指针:
TSpecificFunctor(TClass* _pt2Object, void(TClass::*_fpt)(const char*))
{ pt2Object = _pt2Object; fpt=_fpt; }
致电:
(*pt2Object.*fpt)(string);
是否可以传递单个参数,如C-style:
func() -- call
func -- function pointer
为什么 obj.method 不是指向类成员的完整指针?
答案 0 :(得分:7)
语法object.*ptmf
不会创建中间对象。它没有任何意义,并且被语言所禁止。你有立即调用访问成员函数指针的结果。
您可以使用std::bind
显式创建这样的对象,它将ptmf解释为仿函数对象,并使隐式this
参数显式化。
auto fn = std::bind( ptmf, object, std::placeholders::_1 );
std::function< void( const char * ) > stdfn = fn;
fn( "foo" ); // equivalent to object.*ptmf( "foo" );
请注意,此功能是C ++ 11中的新功能。虽然C ++ 03 TR1有function
和bind
,但它们不会在ptmf上执行此转换。 (普通的C ++ 03可以使用std::mem_fn
和std::bind1st
来完成这项工作,但是它们使用起来非常痛苦并且已被弃用。)
答案 1 :(得分:1)
是否可以将指向类的成员传递为C ++中的单个参数?
不,这是不可能的。您需要要在其上调用方法的类的对象。
您可以使用lambda functions解决此问题,如下例所示:
#include <iostream>
#include <functional>
void call( const std::function< void( const char * a ) > & fn )
{
fn("hi");
}
void foo( const char * a )
{
std::cout << "foo : " << a << std::endl;
}
class bar
{
public:
void operator()( const char * a )
{
std::cout << "bar : " << a << std::endl;
}
};
int main()
{
bar b;
const auto f1 = [&]( const char * a ){ b(a); };
const auto f2 = foo;
call( f1 );
call( f2 );
}
答案 2 :(得分:1)
问问自己是否可以在不指定对象的情况下调用成员方法。 考虑一下:
class A {
public: void m() {}
};
int main() {
m(); // can't call without object - like: A a; a.m();
}