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にはとがfunctionありbindますが、ptmfではこの変換を実行しません。(プレーンC ++ 03はとで作業を行うことができますが、使用するのが非常に面倒であり、非推奨になっています。std::mem_fnstd::bind1st

于 2012-07-05T09:11:32.000 に答える
1

オブジェクトを指定せずにmemberメソッドを呼び出すことができるかどうかを自問してください。このことを考慮:

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

C ++でクラスメンバーへのポインタを単一の引数として渡すことは可能ですか?

いいえ、できません。メソッドを呼び出すクラスのオブジェクトが必要です。

次の例のように、ラムダ関数を使用してこれを回避できます。

#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 に答える