Здравствуйте, ilnar, Вы писали:
I>сделай фугкцию обертку. I>лямбда функции это объекты с перегруженным оператором, а WINAPI хочет чистые функции с с особой конвенцией вызова
Если нет захваченных аргументов, то есть преобразование в указатель на функцию.
5.1.2.6
The closure type for a lambda-expression with no lambda-capture has a public non-virtual non-explicit const
conversion function to pointer to function having the same parameter and return types as the closure type’s
function call operator. The value returned by this conversion function shall be the address of a function
that, when invoked, has the same effect as invoking the closure type’s function call operator.
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, Слава, Вы писали:
С>>А во вторых, можешь обяснить причину такого поведения?
__>По стандарту: __>http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3052.html
__>Если нет захваченных аргументов, то есть преобразование в указатель на функцию.
__>5.1.2.6 __>
__>The closure type for a lambda-expression with no lambda-capture has a public non-virtual non-explicit const
__>conversion function to pointer to function having the same parameter and return types as the closure type’s
__>function call operator. The value returned by this conversion function shall be the address of a function
__>that, when invoked, has the same effect as invoking the closure type’s function call operator.
Здравствуйте, alexeiz, Вы писали:
A>Убери capture parameters [&foundHWnd, &procID], и тогда будет работать. Например:
Не будет. Нужна функция а) статическая б) stdcall. У лямбда же иное — это объект с перегруженным оператором вызова. Скрестить их можно только через переходники.
лямбда без capture параметров прекрасно подходит для
вызова из уже скомпиленного двоичного кода ничто
не мешает конвертнуть ее в указатель на функцию
а вот с capture параметрами сложнее надо this передавать
по всей видимости иначе как она до capture параметров
дотянется естественно не совместимо с WINAPI
если я все правильно понял
Здравствуйте, alexeiz, Вы писали:
A>Здравствуйте, Слава, Вы писали:
A>Убери capture parameters [&foundHWnd, &procID], и тогда будет работать. Например: A>
A>typedef int (*func)(int);
A>int foo(func f)
A>{
A> return f(10);
A>}
A>int main()
A>{
A> return foo([](int a) { return 2 * a; });
A>}
A>
Здравствуйте, Слава, Вы писали:
С>Здравствуйте, alexeiz, Вы писали:
A>>Здравствуйте, Слава, Вы писали:
A>>Убери capture parameters [&foundHWnd, &procID], и тогда будет работать. Например: A>>
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, alexeiz, Вы писали: A>>В Visual C++, вероятно, такое еще не реализовано. В G++ 4.6 всё нормально. __>В следующем релизе будет работать
а сейчас как быть ? может через std::bind(), std::mem_fn() или через еще что-то можно передать лямбду в качестве callback функции ?
P.S.: кстати, по стандарту лямбды не поддерживают модели вызовов. Т.е. такое []() -> BOOL __stdcall {return TRUE;} компилироваться не должно. В VC++ 2010 SP1 такой код все же компилируется, но при этом __stdcall выбрасывается, как будто бы его нет...
Здравствуйте, 23W, Вы писали:
23W>Здравствуйте, _nn_, Вы писали:
__>>Здравствуйте, alexeiz, Вы писали: A>>>В Visual C++, вероятно, такое еще не реализовано. В G++ 4.6 всё нормально. __>>В следующем релизе будет работать
23W>а сейчас как быть ? может через std::bind(), std::mem_fn() или через еще что-то можно передать лямбду в качестве callback функции ?
Сейчас использовать просто функцию.
Чем вариант плох ?
23W>P.S.: кстати, по стандарту лямбды не поддерживают модели вызовов. Т.е. такое []() -> BOOL __stdcall {return TRUE;} компилироваться не должно. В VC++ 2010 SP1 такой код все же компилируется, но при этом __stdcall выбрасывается, как будто бы его нет...
По стандарту и __stdcall не существует
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, 23W, Вы писали:
23W>>Здравствуйте, _nn_, Вы писали:
__>>>Здравствуйте, alexeiz, Вы писали: A>>>>В Visual C++, вероятно, такое еще не реализовано. В G++ 4.6 всё нормально. __>>>В следующем релизе будет работать
23W>>а сейчас как быть ? может через std::bind(), std::mem_fn() или через еще что-то можно передать лямбду в качестве callback функции ? _NN>Сейчас использовать просто функцию. _NN>Чем вариант плох ?
хотелось все и сразу
23W>>P.S.: кстати, по стандарту лямбды не поддерживают модели вызовов. Т.е. такое []() -> BOOL __stdcall {return TRUE;} компилироваться не должно. В VC++ 2010 SP1 такой код все же компилируется, но при этом __stdcall выбрасывается, как будто бы его нет... _NN>По стандарту и __stdcall не существует
это точно но в принципе поведением VC++ 2010 я удивлен, принял модель вызова и проигнорировал ее
К>Идея в том, чтобы передавать замыкание как аргумент в колбек, и уже в колбеке вызывать всё по-человечески.
Эта идей не работает, т.к. все калбеки имеют разный список параметров... что писать под каждый из них enumwindows_thunk ? толку тогда от лябды... ведь основная идея была уйти от статических функций в своем коде.
Шаблоном к сожалению тут тоже не помочь. Можно сделать шаблоную ф-ю с форматом вызова __stdcall которая бы вызывала экивиалентную ей по списку параметров лямбду, но как эту лямбду передать в шаблон ?