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

时间:2012-07-05 09:01:02

标签: c++ class pointers function-pointers

这里有很好的描述如何通过指针调用成员函数: 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 不是指向类成员的完整指针?

3 个答案:

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

http://ideone.com/ds24F

请注意,此功能是C ++ 11中的新功能。虽然C ++ 03 TR1有functionbind,但它们不会在ptmf上执行此转换。 (普通的C ++ 03可以使用std::mem_fnstd::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(); 
}