> class Class { > public: > void memberfunc(void); > //... > } a, b, *pa = &a, *pb = &pb; > > void (Class::*pmemfunc)(void) = &Class::memberfunc();
на это компилятор (VC) ругаетя. все равно должен быть ststicoм. Где используется статик, сразу отбрасываем. Следовательно остальной код не заработал.(может только у меня)
> > void > f1() { > a.*pmemfunc(); > b.*pmemfunc(); > pa->*pmemfunc(); > pb->*pmemfunc(); > } > // Или даже так > void > f2(Class &ref, Class *ptr, void (Class::*pmf)(void)) { > ref.*pmf(); > ptr->*pmf(); > }
Другое дело, что у этого метода соглашение о вызове thiscall. А это значит, что при вызове функции ВСЕГДА неявно передается указатель на объект, для которого она вызвана. А вызвать ее через полученный таким образом (&method) указатель будет весьма проблематично.
Если тебе надо для передачи в качестве колбяки в какую-нить API, то подумай над вариантом статической функции-члена:
---
Если же ты точно знаешь для какого объекта будет вызвана функция, но не всегда знаешь какая, то нужно смотреть в направлении указателей на член (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 с классами.
> class Class { > public: > void memberfunc(void); > //... > } a, b, *pa = &a, *pb = &pb; > > void (Class::*pmemfunc)(void) = &Class::memberfunc();
на это компилятор (VC) ругаетя. все равно должен быть ststicoм. Где используется статик, сразу отбрасываем. Следовательно остальной код не заработал.(может только у меня)
> > void > f1() { > a.*pmemfunc(); > b.*pmemfunc(); > pa->*pmemfunc(); > pb->*pmemfunc(); > } > // Или даже так > void > f2(Class &ref, Class *ptr, void (Class::*pmf)(void)) { > ref.*pmf(); > ptr->*pmf(); > }
Несколько серьезных протупов - fixed %-)10.12.02 19:13 Автор: amirul <Serge> Статус: The Elderman