2

这里很好地描述了如何通过指针调用成员函数:http: //www.newty.de/fpt/functor.html

但是函子需要获得 2 个参数:指向对象的指针和指向成员函数的指针:

TSpecificFunctor(TClass* _pt2Object, void(TClass::*_fpt)(const char*))
{ pt2Object = _pt2Object;  fpt=_fpt; }

称呼:

(*pt2Object.*fpt)(string);

是否可以像 C 风格一样传递单个参数:

func() -- call
func -- function pointer

为什么obj.method不是完整的指向类成员的指针?

4

3 回答 3

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" );

http://ideone.com/ds24F

请注意,此功能是 C++11 中的新功能。尽管 C++03 TR1 有functionand bind,但它们不会在 ptmf 上执行此转换。(普通的 C++03 可以使用 and 来完成这项工作std::mem_fnstd::bind1st但它们使用起来非常痛苦并且已被弃用。)

于 2012-07-05T09:11:32.000 回答
1

是否可以在 C++ 中将指向类成员的指针作为单个参数传递?

不,这是不可能的。您需要要调用该方法的类的对象。

你可以通过使用lambda 函数来解决这个问题,就像在下一个例子中一样:

#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 );
}
于 2012-07-05T09:05:06.670 回答
1

问问自己是否可以在不指定对象的情况下调用成员方法。考虑一下:

class A {
public: void m() {}
};
int main() {
   m(); // can't call without object - like: A a; a.m(); 
}
于 2012-07-05T09:08:10.420 回答