Ну или в книжку Александреску "Современное проектирование на C++". Там эта задача подробно решена. Оно еще и работает не совсем медленно (2 уровня косвенности, кажется).
class A{
public: void func();
};
typedef void (A::*func_ptr_type)(void);
..
A *a = new A;
func_ptr_type func_ptr = A::func;
а вот здесь трабл:
> (*func_ptr)(y); // вызов
во-первых не компилится:
error C2171: '*' : illegal on operands of type 'func_ptr_type'
error C2064: term does not evaluate to a function taking 0 arguments
а во-вторых, по идее, должно выглядеть как-то так:
__asm {
mov ecx, dword ptr [a]
call [func_ptr]
}
попробую макрос написать..
[upd]
не пишется макрос:
#define call_ptr( p, o ) __asm mov ecx, dword ptr [o]; __asm call [p];
=>
call_ptr( ptr, a );
00413B52 mov ecx,dword ptr [a]
а куда 'call [p]' делся??
PS: Спасибо!
Re: а куда 'call [p]' делся??09.11.04 15:48 Автор: leo <Леонид Юрьев> Статус: Elderman
';' после __asm интерпретируется интерпретируется как начало комментария, для define нужно примерно так:
#define call_ptr( p, o ) {__asm {mov ecx, dword ptr [o]}; __asm {call [p];} }
Упс... (Re: term does not evaluate to a function...)09.11.04 15:44 Автор: leo <Леонид Юрьев> Статус: Elderman Отредактировано 09.11.04 15:50 Количество правок: 1
> во-первых не компилится: > error C2171: '*' : illegal on operands of type > 'func_ptr_type' > error C2064: term does not evaluate to a function taking 0 > arguments
Забыл что еще нужен объект (экземпляр класса):
class some_class
{
public:
int some_field;
some_class()
{
some_field = 0;
}
int some_class_func(int dummy)
{
return some_field += dummy;
}
};
int main(int argc, char *argv[])
{
int (some_class::*class_func_ptr)(int) = some_class::some_class_func;
some_class some_object, *pointer_to_some_object = &some_object;
return (some_object.*class_func_ptr)(1)
+ (pointer_to_some_object->*class_func_ptr)(2);
};
---
с ассемблером как-то универсальнее.. можно указатели на разные классы делать..10.11.04 11:57 Автор: zelych Статус: Member
Ну или в книжку Александреску "Современное проектирование на C++". Там эта задача подробно решена. Оно еще и работает не совсем медленно (2 уровня косвенности, кажется).