Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
#1

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

20.02.2014, 01:46. Просмотров 491. Ответов 10

Доброй ночи. Есть функция:
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
В чем может быть проблема? Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2014, 01:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Верно ли такое использование лямбд (C++):

Использование лямбд - C++
Допустим есть 2 класса A и B, из B нужно вызывать некоторые методы из А, допустим таких методов немного 2-3 не более, а то и во все 1. ...

В чем плюсы лямбд? - C++
В чем очевидные и/или измеряемые плюсы лямбд в C++? Повышает ли это скорость кода? Или памяти меньше? Или еще что-то? Ну кроме повышения...

Допускается ли такое использование лямбды - C++
Имеется код #include &lt;iostream&gt; using namespace std; int main() { cout &lt;&lt; ()-&gt;float{return 9.4;}; return 0; ...

Что значит такое использование указателей - C++
Разбираю прогу для клиент сервера и никак не могу понять что значит такое использование указателей 1) char buff; потом в...

Пожалуйста обьясните что вообще это такое "использование циклов с предпосылками и постпосылками" - C++
Пожалуйста обьясните что вообще это такое &quot;использование циклов с предпосылками и постпосылками&quot; ?

Верно ли, что притяжение на поверхности Меркурия такое же как на Марсе? - Астрономия
Вероятно речь идет не о точном равенстве, а о равенстве с небольшой погрешностью. В принципе чем меньше небесное тело, тем слабее оно...

10
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
20.02.2014, 01:53 #2
iRomul, лямбду можно привести к указателю на функцию только если она ничего не захватывает.
1
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
20.02.2014, 01:56  [ТС] #3
gray_fox, Хреново. В JavaScript можно передать лямбду с параметром и использовать переменные из контекста определения. Я надеялся, что здесь такое прокатит. Хорошо, а какие есть пути решения (кроме использования void* param)?
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
20.02.2014, 02:01 #4
Цитата Сообщение от iRomul Посмотреть сообщение
Хорошо, а какие есть пути решения (кроме использования void* param)?
Мне кажется из нормальных - никаких. Так что самый лучший через void * param, он для этого там и есть, чтобы передавать userdata.
1
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
20.02.2014, 02:03 #5
iRomul, можно использовать параметр шаблона вместо указателя на функцию (как в алгоритмах STL), или std::function<...>.

Добавлено через 57 секунд
Это если там не сторонняя либа, иначе никак.
1
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
20.02.2014, 02:05 #6
Цитата Сообщение от gray_fox Посмотреть сообщение
iRomul, можно использовать параметр шаблона вместо указателя на функцию (как в алгоритмах STL), или std::function<...>.
Это было бы здорово, но тогда зачем было городить интерфейс в стиле Си с userdata через void*? Мне кажется это не тот случай. Хотя, если есть возможность, то твой совет самое то.
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
20.02.2014, 02:09 #7
Хотя с параметром шаблона это я конечно поспешил, бредовая идея)
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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);
Но тогда еще не было лямбд в С++ и делалось это через страшные воркэраунды. А сейчас-то, красота
1
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
20.02.2014, 02:45 #9
DrOffset, тут такое дело - зачем городить шаблоны, если аргумент (callback) всё равно в итоге будет храниться в одном формате? Мне кроме того же std::function<...> или аналога ничего в голову не приходит. Другое дело, если есть набор перегрузок в духе (функция), (объект, функция-член), тогда это имеет смысл.
1
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
20.02.2014, 02:47 #10
Цитата Сообщение от gray_fox Посмотреть сообщение
DrOffset, тут такое дело - зачем городить шаблоны, если аргумент (callback) всё равно в итоге будет храниться в одном формате? Мне кроме того же std::function<...> или аналога ничего в голову не приходит. Другое дело, если есть набор перегрузок в духе (функция), (объект, функция-член), тогда это имеет смысл.
Согласен, поэтому и сказал, что зависит от использования.
1
gray_fox
20.02.2014, 03:05     Верно ли такое использование лямбд
  #11

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2014, 03:05
Привет! Вот еще темы с ответами:

Final переменные для лямбд - Java SE
Есть некоторая коллекция цветов и некоторая коллекция кнопок (можно и не кнопок, суть не в них, суть в лямбдах). Циклом for каждой кнопке...

Что такое this и почему его использование непостоянно - C#
Добрый день. Изучаю C# и нет ясности с использованием ключевого слова this. В примерах то его используют, то нет. Например.. public...

Что такое процедуры и функции в паскале, их построение и использование? - Pascal ABC
Процедуры и функции в паскале, а точнее построение и использование что это? в инете ничего толком не нашел HEEEEEEEELP!

Что такое APEX? Преимущества использование этого средства разработки сайтов - Oracle
Пользовались ли вы когда-нибудь APEX? Не могли бы вы назвать главные преимущества и недостатки такой технологии


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

Или воспользуйтесь поиском по форуму:
11
20.02.2014, 03:05
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.