Hello, Irokez!
You wrote on Tue, 21 Dec 2004 23:20:23 GMT:
I> Смешно вы говорите. I> Трасировал на встроенном дизасемблере вызов функции метода класса. Или я тут один такой умный I> (не примите как возвышение над вами). неявный указатель this, нужен только для одной вещи, чтобы I> обратиться к член-данным класса, и ни при чем тут функции. КОД В СТУДИЮ
Ессесно корректного приведения указателя на метод класса к void*, и без хаков.
Posted via RSDN NNTP Server 1.9 delta
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
К сожалению Я уже написал что тема закрыта. А о том как привести тип спросите у ЭКСПЕРТА, MICROSOFT, или додумайтесь сами.
Кстати что поразительно у меня есть 100% рабочий код приведения метода класса к любому типу, а вторым постом после моего идет ответ что это сделать невозможно, а не вопрос как это сделать. Как говорили у нас в академии учите мат. часть.
Ребята я не гений, и я не кичусь своими знаниями, я не писал приложения Хэлло Ворлд ни разу.
Здравствуйте, Irokez, Вы писали:
I>К сожалению Я уже написал что тема закрыта. А о том как привести тип спросите у ЭКСПЕРТА, MICROSOFT, или додумайтесь сами. I>Ребята я не гений, и я не кичусь своими знаниями, я не писал приложения Хэлло Ворлд ни разу
Неожидал что за ночь тут развернётся такая жаркая дискуссия
Честно говоря удивлён как на ровном месте создалась конфликтная ситуация.
Не понимаю зачем закрывать тему?
Вот демагогию заканчивать надо, а обсуждение технических вопросов предлагаю продолжить.
Вдруг вы заблуждаетесь или мы вас не поняли.
I>Кстати что поразительно у меня есть 100% рабочий код приведения метода класса к любому типу, а вторым постом после моего идет ответ что это сделать невозможно
ну тут всё ясно
простой указатель и указатель на функцию-член суть разные вещи, поэтому в лоб это преобразование сделать невозможно. Возможно это приведение будет работать на какой то платформе в простейшем случае, но в общем случае это сделать нельзя.
Но можно сделать например так:
обернуть указатель на функцию-член в структуру и указатель на её экземпляр уже привести к
void*.
О чем спор? Прежде чем дискутировать, как меня учили, следует опредеиться в терминологии.
Если разобраться, то окажется, что позиция Irokeza отличается от позиции ALL в двух вопросах.
1. Что такое адресс функции-члена?
Irokez — это тот физ. адрес, по которму делается call при вызове функции на уровне машинного кода.
ALL — это семейство типов С++, в соответствии с синтаксисом которого, подставляя адрес объекта и аргументы, получается корректный вызов функции (с учетом виртуальности и множественного / виртуального наследованя)
2. Что таке привдение типов?
Irokez — это насильственное приведение, когда исходное значение и результирующее совпадют только численно (и то не всегда)
ALL — это один из принципов С++, гарнатирующий корректное поведение программы с точки зрения компилятора.
Так вот, исходя из этих терминов, обе стороны по-своему правы .
Это, конечно, мое ИМХО, возможно, я чет недопонял.
Здравствуйте, Irokez, Вы писали:
I>Здравствуйте, Went, Вы писали:
I>Полностью поддерживаю высказываение.
I>Но, с точки зрения синтаксиса в моем коде я не выхожу за пределы стандартных С++ преобразований.
class A {
public:
void __stdcall F1(int k)
{
printf("A::F1(%d)\n",k);
}
};
и есть второй класс
class B: public A {
public:
void __stdcall F1(int k,int d)
{
printf("B::F1(%d,%d)\n",k,d);
}
};
теперь внимание ответ.
struct Method {
void* mthdOwner;
void* mthdFunction;
Method(void* Owner,...)
{
va_list mthd;
va_start(mthd,Owner);
mthdOwner = Owner;
mthdFunction = va_arg(mthd,void*);
va_end(mthd);
}
};
Ну и где то в коде
B b;
Method m(&b,B::F1);
И теперь пусть хоть кто-то скажет что нельзя привести указатель на функцию к типу войд*, или другому типу
Re[2]: Указатель на функцию
От:
Аноним
Дата:
22.12.04 08:50
Оценка:
Идея понятна.
Создается промежуточный объект, который хранит пару (объект, адрес метода).
Затем адрес на объект преобразуется в void*
Это в общем стандратное и нормальное решение.
Правда реализовать это можно куда элегантнее и красивее
и в итоге получишь некий аналог известного из boost'а
Но это ведь не то же самое, о чем говорил Ирокез.
Хотя хрен его знает, о чем он говорил.
Его кода никто пока не видел.
Здравствуйте, А.Якубовский, Вы писали:
АЯ>И теперь пусть хоть кто-то скажет что нельзя привести указатель на функцию к типу войд*, или другому типу
Ну ты представляешь! Все-равно нельзя! Слабо в след. примере вызвать твоим способом A::Func для объекта d?
#include <iostream>
class A
{
int a;
public:
void Func()
{
}
};
class B : virtual public A
{
int b;
};
class C : virtual public A
{
int c;
};
class F
{
int f;
};
class D : public F, public B, public C
{
};
int main()
{
void (A::*func)() = &A::Func;
D d;
(d.*func)();
return 0;
}
Здравствуйте, Glоbus, Вы писали:
G>Здравствуйте, А.Якубовский, Вы писали:
G>Ээээ.. G>1) А как теперь пользотвать этот класс мэтода? G>2) Что случится если sizeof(void*) < sizeof(void A::*) ?
Во первых никогда не встречал чтоб указатель на 32-битной платформе был больше 32
А вам блин еще и подай как маршалинг у меня реализован на основе этого кода. Я блин парился всю ночь, по дружные издевки, а потом дайте мне плз. реализацию маршалинга. Ребята не по взрослому получается.
Здравствуйте, А.Якубовский, Вы писали:
АЯ>Здравствуйте, Аноним, Вы писали: АЯ>Это и есть Ирокез, я просто сменил имя
что скажешь теперь?
class A
{
};
class B: virtual public A {
public:
void __stdcall F1(int k,int d){}
};
int main()
{
B b;
Method m(&b,B::F1);
printf("%i", sizeof (&B::F1));
}
Здравствуйте, А.Якубовский, Вы писали:
АЯ>теперь внимание ответ. АЯ>И теперь пусть хоть кто-то скажет что нельзя привести указатель на функцию к типу войд*, или другому типу
Да вот я скажу, что нельзя. Хочешь? На:
#include <iostream>
using namespace std;
struct A
{
};
struct B : virtual A
{
virtual void foo() {}
};
int main()
{
cout << "size of void* = " << sizeof(void* ) << endl;
cout << "size of &B::foo = " << sizeof(&B::foo) << endl;
}
Здравствуйте, Аноним, Вы писали:
А>Это невозможно.
А>Но boost::bind и boost::function помогут А>тебе решить твою задачу.
А>P.S. Популярный это однако вопрос, о том как указатель на метод А>класса преобразовать в void* . А>Пару раз за неделю он тут возникает
Значит пора Q&A написать... Кто напишет?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!