0

これが C++ で可能かどうかはわかりません。関数または静的メンバー関数へのポインターをパラメーターとして渡すことができることは知っています。特定のオブジェクトの関数ポインターが必要なため、関数が実行されると、オブジェクトに対して実行されます。

class MyClass
{
   public:
      MyClass(int id){mId = id;}
      void execute(){cout<<mId<<endl;}
   private:
      int mId;
};


MyClass obj1(1);
MyClass obj2(2);

typedef (Executor)();
Executor ex1 = &obj1::execute();
Executor ex2 = &obj2::execute();

したがって、ex1 が実行されると「1」が出力され、ex2 が実行されると「2」が出力されます。これは可能ですか?

4

3 に答える 3

9

これを処理する機能は関数テンプレートbindです:

auto ex1 = std::bind(&MyClass::execute, obj1);

バインドをfunctionオブジェクトに保存できます。

std::function<void()> ex1 = std::bind(&MyClass::execute, obj1);

デフォルトでは値によってbind保存objされることに注意してください。次の方法で参照を保存できますref

std::function<void()> ex1 = std::bind(&MyClass::execute, std::ref(obj1));

関連する機能はmem_fn、メンバー関数ポインターをラップする です。

void (MyClass::*ex1)() = &MyClass::execute;  // raw member function pointer
ex1(obj1);

auto ex1 = std::mem_fn(&MyClass::execute);   // mem_fn wrapper
ex1(obj)

ただし、mem_fnインスタンスをバインドしないため、呼び出すたびにインスタンスを提供する必要があります。


メンバー関数をバインドするときにクラス名を書かないようにするために、マクロを使用できます。

#define BIND_MEM_FN(o,m) \
    std::bind(&std::remove_reference<decltype(o)>::type::m, (o))

メンバー関数ポインターはその型と名前からしか形成できず、関数に名前 (修飾されていない id ) を渡すことができないため、マクロが必要です。

于 2012-10-22T15:01:08.760 に答える
1

それは可能ですが、あなたが説明する方法ではありません。上記のコメントで提案されている方法で実行できますが、よりエレガントで C++ の方法は、ファンクターを使用することです。Functor は基本的に、演算子が()オーバーロードされたオブジェクトです。あなたの場合、次のようになります。

class MyClass
{
   public:
       MyClass(int id){mId = id;}
       void operator()(){cout<<mId<<endl;}
   private:
   int mId;
};

MyClass obj1(1);
MyClass obj2(2);

obj1();
obj2();

このようにして、オブジェクトは実際に関数の動作を模倣します。ここで詳細を読むことができます: http://en.wikipedia.org/wiki/Function_object#In_C_and_C.2B.2B

于 2012-10-22T15:05:51.147 に答える
0

メンバー関数ポインター:

typedef void (MyClass::*Executor)();
Executor ex1 = &MyClass::execute;
Executor ex2 = &MyClass::execute;

obj1.*ex1();
obj2.*ex2();

編集:コメントに記載されているようにコードを修正しました。

実際に(メンバー)関数ポインターを使用することはめったにないため、間違いを犯しました。しかし、std::bind を使用しているからではなく、ポリモーフィズムを使用しているからです :)

実際、OS API とのインターフェース以外で (メンバー) 関数ポインターを最後に使用したのはいつか覚えていません。メンバー関数ポインターは非メンバー関数ポインターよりも優れており、std::bind/std::function はメンバー関数ポインターよりも優れている可能性がありますが、ポリモーフィズムは上記のすべてよりも優れています。

于 2012-10-22T15:01:10.913 に答える