| eXeL@B —› Программирование —› Безобразие с типами С++ |
| Посл.ответ | Сообщение |
|
|
Создано: 05 марта 2007 06:23 · Личное сообщение · #1 |
|
|
Создано: 05 марта 2007 06:47 · Поправил: Gelios · Личное сообщение · #2 |
|
|
Создано: 05 марта 2007 07:19 · Поправил: jasfasola · Личное сообщение · #3 |
|
|
Создано: 05 марта 2007 09:12 · Личное сообщение · #4 |
|
|
Создано: 05 марта 2007 10:02 · Поправил: jasfasola · Личное сообщение · #5 О пацаны уже нашел :] вернее сначала нашел инфу об указателях на функции - члены, а потом сам справился. #include "stdafx.h" class A { public: A(){} ~A(){} void func(int param) { printf("Hello World! "); } }; int main(int argc, char* argv[]) { A* p = new A; void(A::*_ptr)(int param); _ptr = p->func; int* temp_ptr = (int*) &_ptr; int addr_func = (int) *temp_ptr; ((void(__stdcall*)(int))addr_func)(1); return 0; } ![]() |
|
|
Создано: 05 марта 2007 13:36 · Поправил: s0larian · Личное сообщение · #6 Кста, на С++ с templates можно сделать подобное используя алгоритмы и templated functors. Например используя boost + STL:
P.S. это Observer design pattern ![]() |
|
|
Создано: 09 марта 2007 06:06 · Личное сообщение · #7 |
|
|
Создано: 09 марта 2007 09:18 · Поправил: s0larian · Личное сообщение · #8 Player, хе хе, не парь мозги Вся чихня с functors которые создаются на лету на стеке становится inline. Только что посмотрел в VS2005 release build - там два десятка инсткукций, которые проверяют есть ли такой метод в vtable, берут начало контейнера и вызывают for_each(). Ну а тот, в случае вектора, просто вызывает функцию через полученный указатель для кажного элемента в своём массиве.
Ничего лишнего. Мораль проста - компилеры становятся всё умнее, не надо писать херню с указателями в таких случаях. (оговорюсь, что это, ессно, не подходит для случая когда в драйвере надо всё забить в пару инструкций) ![]() |
|
|
Создано: 10 марта 2007 01:10 · Поправил: S_T_A_S_ · Личное сообщение · #9 jasfasola пишет: void(A::*_ptr)(int param); _ptr = p->func; int* temp_ptr = (int*) &_ptr; int addr_func = (int) *temp_ptr; ((void(__stdcall*)(int))addr_func)(1); Вызов не правильный. __stdcall не передаёт this в ecx. Откастить поинтер на функцию член к другому типу можно и без копирования: template<typename T>
![]() |
| eXeL@B —› Программирование —› Безобразие с типами С++ |







Вся чихня с functors которые создаются на лету на стеке становится inline. Только что посмотрел в VS2005 release build - там два десятка инсткукций, которые проверяют есть ли такой метод в vtable, берут начало контейнера и вызывают for_each(). Ну а тот, в случае вектора, просто вызывает функцию через полученный указатель для кажного элемента в своём массиве.
Для печати