Здравствуйте, 23W, Вы писали:
23W>Эта идей не работает, т.к. все калбеки имеют разный список параметров... что писать под каждый из них enumwindows_thunk ? толку тогда от лябды... ведь основная идея была уйти от статических функций в своем коде.
Если есть более чем одно замыкание-колбек для EnumWindow, то идея работает. Без этого пришлось бы заводить структуру для передачи данных из контекста.
Что-то такое
void foo()
{
...
struct args
{
HWND& found; DWORD procid;
static BOOL CALLBACK ewp(HWND w, LPARAM p) { return (*(args*)p)->ewp(w); }
BOOL ewp() { ..... }
} a;
EnumWindows(args::ewp, &a);
...
}
Ну не мрак ли?
23W>Шаблоном к сожалению тут тоже не помочь. Можно сделать шаблоную ф-ю с форматом вызова __stdcall которая бы вызывала экивиалентную ей по списку параметров лямбду, но как эту лямбду передать в шаблон ?
А примерно так
template<class CB> struct callback;
template<class F> struct callback_base
{
typedef function<F> closure_type;
static LPARAM param(closure_type const& f) { return (LPARAM)&f; }
};
template<class R> struct callback<R (CALLBACK*)(LPARAM)> : callback_base<R(LPARAM)>
{
static R CALLBACK thunk(LPARAM p) { return (*(closure_type*)p)(); }
};
template<class R, class A1> struct callback<R (CALLBACK*)(A1, LPARAM)> : callback_base<R(A1,LPARAM)>
{
static R CALLBACK thunk(A1 a1, LPARAM p) { return (*(closure_type*)p)(a1); }
};
template<class R, class A1, class A2> struct callback<R (CALLBACK*)(A1, A2, LPARAM)> : callback_base<R(A1,A2,LPARAM)>
{
static R CALLBACK thunk(A1 a1, A2 a2, LPARAM p) { return (*(closure_type*)p)(a1,a2); }
};
.....
.....
EnumWindow(
callback<ENUMWINDOWPROC>::thunk,
callback<ENUMWINDOWPROC>::param( [](HWND)->BOOL { ..... } )
);
.....