【问题标题】:Is it possible to pass a pointer-to-class-member as an single argument in C++?是否可以在 C++ 中将指向类成员的指针作为单个参数传递?
【发布时间】:2012-07-05 09:01:01
【问题描述】:

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

【问题讨论】:

  • 你能澄清一下“为什么 obj.method 不是完整的指向类成员的指针吗?”这是什么意思?
  • (*pt2Object.*fpt)(string); 不起作用。你需要(pt2Object->*fpt)(string);。
  • Naveen,我想获得指向特定对象(obj)和特定类成员(成员)的单个参数。但似乎我开始明白了......
  • 土豆泥,为什么? *pt2Object 是一个取消引用的指针,可以使用 '.' 访问成员,不是吗?
  • 后缀 .* 绑定在前缀 * 之前。你必须这样做((*pt2Object).*fpt)(string);。

标签: c++ class pointers function-pointers


【解决方案1】:

语法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 有 function 和 bind,但它们不会在 ptmf 上执行此转换。 (普通的 C++03 可以用 std::mem_fn 和 std::bind1st 完成这项工作,但它们使用起来非常痛苦并且已被弃用。)

【讨论】:

  • 如果我正确理解了这个问题,他想将它作为参数传递给函数,因此您需要指定类型 - 不要使用 auto
  • @BЈовић 已经更新了 ;v) 。请注意,无法显式指定std::bind 的返回类型,std::function 可能会添加间接调用,因此auto 是首选,除非您需要将其存储在本地范围之外或传递给非模板功能。
  • @SteveJessop 同样,已经更新 :) 只需刷新页面
【解决方案2】:

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

class A {
public: void m() {}
};
int main() {
   m(); // can't call without object - like: A a; a.m(); 
}

【讨论】:

  • 我写错评论并删除了,对不起。 A.m 是谵妄 :) 如果你创建一个对象,A obj,为什么 obj.m 不是一个正确的指向成员的指针?
  • @legotron A::m() 只为 A 类中的每个对象定义一次并派生。相当于“C”函数A_m(A* const this)。类似的问题:拥有int f(int i); 的功能,您是否希望拥有&amp;f(1) 的有效地址?您只能将pf = &amp;f 用作(*pf)(1) - 您不能说pf = &amp;f(1); (*pf)()
【解决方案3】:

是否可以在 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 );
}

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 2013-08-11
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    相关资源
    最近更新 更多