以下通过指向成员函数的指针调用 D::foo
函数的方法将会生成错误:必须使用 .*
或 ->*
在 'f (...)' 中调用指向成员函数的指针。当然,这不是我们调用指向成员函数的方式。
正确的调用方式是 (d.*f)(5);
或者 (p->*f)(5);
我的问题是,“有没有一种方法可以在左手边不使用类对象来调用类的成员函数?我想知道是否可以像普通参数一样传递类对象 (this
) 作为参数?”
在我看来,归根结底(在汇编/二进制级别上),所有类的成员函数都是正常的函数,应该对 n+1 个参数进行操作,其中 (+1 是为了 this
)
如果我们谈论下面的 D::foo
函数,在汇编/二进制级别上,它应该操作两个参数:
- 类对象本身(称为
this
的指向类 D 对象的指针) - 以及
int
。
那么,有没有一种方法(或黑客技巧)可以使用作为函数参数传递给它的类对象而不是在类对象上使用 . 或 -> 或 .* 或 ->*
运算符来调用 D::foo
?
示例代码:
#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;
}
一个方法是使用boost绑定,即
(boost:: bind (&D::foo, &d, 5)) ();
编辑: “请注意,我不是在寻找一个可以工作的程序版本,我知道如何使其工作。”
bind
结果类型的operator()
中,会有类似于(ptr->*fun)(arg)
这样的内容;你看不到它是因为它被埋在库的实现中。” - Mike Seymour;
一样,并非"人为限制"。这只是语言的语法结构。 - Angew is no longer proud of SO