Другое дело, что у этого метода соглашение о вызове thiscall. А это значит, что при вызове функции ВСЕГДА неявно передается указатель на объект, для которого она вызвана. А вызвать ее через полученный таким образом (&method) указатель будет весьма проблематично.
Если тебе надо для передачи в качестве колбяки в какую-нить API, то подумай над вариантом статической функции-члена:
class Class{
public:
static void memberfunc(void);
//...
};
void (*pfunc)(void) = &Class::memberfunc;
void
f() {
pfunc();
}
---
Если же ты точно знаешь для какого объекта будет вызвана функция, но не всегда знаешь какая, то нужно смотреть в направлении указателей на член (pointer to member):
class Class {
public:
void memberfunc(void);
//...
} a, b, *pa = &a, *pb = &pb;
void (Class::*pmemfunc)(void) = &Class::memberfunc();
void
f1() {
a.*pmemfunc();
b.*pmemfunc();
pa->*pmemfunc();
pb->*pmemfunc();
}
// Или даже так
void
f2(Class &ref, Class *ptr, void (Class::*pmf)(void)) {
ref.*pmf();
ptr->*pmf();
}
---
Вот только по моей глубокой имхе второй вариант из области извращений. Практически везде, где могут понадобиться указатели на функции-члены (не статические) можно обойтись наследованием и виртуальными функциями, и при этом код будет гораздо элегантнее и легче в сопровождении и расширении.
Сам я люблю C, но при этом не стоит смешивать парадигмы и писать на C++ просто как на C с классами.
|