Re[3]: Лямбду в WinAPI
От: Кодт Россия  
Дата: 16.12.11 14:15
Оценка:
Здравствуйте, 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 { ..... } )
  );
.....
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.