D::foo
メンバーへのポインター関数を介して関数を呼び出す以下のメソッドは、エラーを生成します: 'f (...)' でメンバーへのポインター関数を使用.*
または->*
呼び出す必要があります
.. もちろん、それはポインターへの呼び出し方法ではありませんメンバー関数。
正しい呼び出し方は(d.*f)(5);
OR(p->*f)(5);
私の質問は、「左側にクラス オブジェクトがないクラスのメンバー関数を呼び出す方法はありますか?」です。this
クラス オブジェクト ( ) を通常の引数として渡すことはできますか?
私の考えでは、1 日の終わり (アセンブリ/バイナリ レベル) では、クラスのすべてのメンバー関数は通常の関数であり、n + 1 個の引数で動作する必要があります (+1 はthis
)
以下の関数について話す場合D::foo
、アセンブリ/バイナリ レベルでは、2 つの引数で動作する必要があります。
- クラス オブジェクト自体 ( と呼ばれるクラス D オブジェクトへのポインタ
this
) - と
int
.
それで、クラスオブジェクトで演算子D::foo
を使用する代わりに、関数引数として渡されたクラスオブジェクトで呼び出す方法(またはハック)はありますか?. or -> or .* or ->*
サンプルコード:
#include <iostream>
using namespace std;
class D {
public:
void foo ( int a ) {
cout << "D" << endl;
}
int data;
};
//typedef void __cdecl ( D::* Func)(int);
typedef void ( D::* Func)(int);
int main ( void )
{
D d;
Func f = &D::foo;
f(&d, 5);
return 1;
}
1つの方法は、ブーストバインドを使用することです
(boost:: bind (&D::foo, &d, 5)) ();
編集:「このプログラムの機能するバージョンを探しているわけではないことに注意してください。機能させる方法を知っています」