Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Явное приведение типов


Автор: Ivan. 25.4.2006, 09:34
Как привести указатель метода класса к указателю памяти:
Converting from void (T::*)() to void*
а лучше:
Converting from void (T::*)() to void (*)(T *)
известно, что при вызове метода класса перед перечислением входных параметров вклинивается указатель объекта, поэтому:
class T {
public:
void Func();
};
T t;
t.Func();
и
void (*Func)(T *);
Func = &T::Func;
Func(&t);
приводят к одному результату, но компилятор не такой дурак, чтобы позволить мне это сделать.
Указатель метода не приводится ни к одному промежуточному типу: (void *), (int), ...
Этот вопрос можно решить на уровне ASM, но указатель функции лежит в области сода и изменению не подлежит, по этому данное преобразование компелятор должен выполнить на уровне предкомпиляции.
Помогите решить этот вопрос smile  

Автор: Vyacheslav 25.4.2006, 10:37
Код

typedef void (*TFunc)(T*);
typedef void (T::*Method)();
Method method = &T::Func;
TFunc* Func  = (TFunc*)(&method);
(*Func)(&t);
 

Автор: DeadSoul 25.4.2006, 21:30
А что ты хочешь сделать? Может boost::function+boost::bind тебя спасут? 

Автор: Ivan. 13.12.2006, 18:26
Решил!
Код

template <class T> void *GetMethod(T Method) { return *(void **)&Method; }
//---------------------------------------------------------------------------
class T {
public:
    int a;
    void f() {    }
};
//---------------------------------------------------------------------------
typedef void (*TEvent)(void *Object);
int main(){
    T t;
    t.a = 10;
    TEvent Event = (TEvent)GetMethod(&T::f);
    Event(&t);
}


Автор: zabivator 13.12.2006, 19:21
Ivan., первое решение:
Код

union Converter
{
void (T::*method) ();
void (*function) ();
};
//...

Converter a;
a.method = &T::Func;
void (*f)() = a.function;

второе решение:
Код

#include <boost/bind.hpp>
#include <boost/function.hpp>

//...
T t;
boost::function< void () > f = boost::bind(&T::Func,&t);
f(); 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)