Форум программистов, компьютерный форум CyberForum.ru

Верно ли такое использование лямбд - C++

Восстановить пароль Регистрация
 
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
20.02.2014, 01:46     Верно ли такое использование лямбд #1
Доброй ночи. Есть функция:
C++
1
void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata=0 )
На вход она принимает MouseCallback - функцию, вида:
C++
1
void my_mouse_callback( int event, int x, int y, int flags, void* param );
Мне же нужно выдернуть несколько объектов из локальной функции (в которой я вызываю setMouseCallback). Можно, конечно, создать структуру этих объектов и тащить еще через void* param, но я решил поступить проще - использовать лямбды. Однако такая запись:
C++
1
2
3
4
5
6
7
8
9
10
setMouseCallback(
        image_window,
        [&preview, &basic_test](int event, int x, int y, int flags, void* param) -> void {
            if(event == CV_EVENT_LBUTTONDOWN) {
                //TODO: удалить отладочный вывод
                cout << "[Callback]: x[" << x << "] y[" << y << "]\n";
                draw_target(preview, x, y, 20);
            } //if
        }//lambda
    );
вызывает ошибку:
error C2664: cv::setMouseCallback: невозможно преобразовать параметр 2 из "main::<lambda_8f6701a187bd999eb050d952113cacc4>" в "cv::MouseCallback" c:\short\projects\ofbench\ofbench\main.cpp 53
В чем может быть проблема? Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.02.2014, 01:53     Верно ли такое использование лямбд #2
iRomul, лямбду можно привести к указателю на функцию только если она ничего не захватывает.
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
20.02.2014, 01:56  [ТС]     Верно ли такое использование лямбд #3
gray_fox, Хреново. В JavaScript можно передать лямбду с параметром и использовать переменные из контекста определения. Я надеялся, что здесь такое прокатит. Хорошо, а какие есть пути решения (кроме использования void* param)?
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
20.02.2014, 02:01     Верно ли такое использование лямбд #4
Цитата Сообщение от iRomul Посмотреть сообщение
Хорошо, а какие есть пути решения (кроме использования void* param)?
Мне кажется из нормальных - никаких. Так что самый лучший через void * param, он для этого там и есть, чтобы передавать userdata.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.02.2014, 02:03     Верно ли такое использование лямбд #5
iRomul, можно использовать параметр шаблона вместо указателя на функцию (как в алгоритмах STL), или std::function<...>.

Добавлено через 57 секунд
Это если там не сторонняя либа, иначе никак.
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
20.02.2014, 02:05     Верно ли такое использование лямбд #6
Цитата Сообщение от gray_fox Посмотреть сообщение
iRomul, можно использовать параметр шаблона вместо указателя на функцию (как в алгоритмах STL), или std::function<...>.
Это было бы здорово, но тогда зачем было городить интерфейс в стиле Си с userdata через void*? Мне кажется это не тот случай. Хотя, если есть возможность, то твой совет самое то.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.02.2014, 02:09     Верно ли такое использование лямбд #7
Хотя с параметром шаблона это я конечно поспешил, бредовая идея)
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
20.02.2014, 02:31     Верно ли такое использование лямбд #8
Цитата Сообщение от gray_fox Посмотреть сообщение
Хотя с параметром шаблона это я конечно поспешил, бредовая идея)
Да почему, зависит же от use-cases. Была такая раньше либина smartwin, там как раз похожим образом эмулировались сигналы-слоты из Qt через шаблоны.

Ну как-то так:
C++
1
2
template<typename SignalT, typename SlotT>
int connect(Object*, SignalT sig, Object*, SlotT slot);
Но тогда еще не было лямбд в С++ и делалось это через страшные воркэраунды. А сейчас-то, красота
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.02.2014, 02:45     Верно ли такое использование лямбд #9
DrOffset, тут такое дело - зачем городить шаблоны, если аргумент (callback) всё равно в итоге будет храниться в одном формате? Мне кроме того же std::function<...> или аналога ничего в голову не приходит. Другое дело, если есть набор перегрузок в духе (функция), (объект, функция-член), тогда это имеет смысл.
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
20.02.2014, 02:47     Верно ли такое использование лямбд #10
Цитата Сообщение от gray_fox Посмотреть сообщение
DrOffset, тут такое дело - зачем городить шаблоны, если аргумент (callback) всё равно в итоге будет храниться в одном формате? Мне кроме того же std::function<...> или аналога ничего в голову не приходит. Другое дело, если есть набор перегрузок в духе (функция), (объект, функция-член), тогда это имеет смысл.
Согласен, поэтому и сказал, что зависит от использования.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2014, 03:05     Верно ли такое использование лямбд
Еще ссылки по теме:

C++ Допускается ли такое использование лямбды
C++ Использование лямбд
C++ Не верно считает

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gray_fox
20.02.2014, 03:05     Верно ли такое использование лямбд
  #11

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Но тогда еще не было лямбд в С++ и делалось это через страшные воркэраунды. А сейчас-то, красота
Всё равно, ИМХО, определение лямбды не особо короткое получается, так что не всегда красота (

Yandex
Объявления
20.02.2014, 03:05     Верно ли такое использование лямбд
Ответ Создать тему

Метки
callback, opencv, лямбды, функции
Опции темы

Текущее время: 14:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru