|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
16.06.2017, 00:12 | #1 |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
Передать контейнер в callback при выполнении запроса sqlite
Мне нужно получить порцию данных из базы SQLite. Для этого я вызываю функцию:
Код:
И у меня есть недописанный класс, в котором предполагается хранить результаты запроса: Код:
Сейчас я думаю про классический сишный вариант - обернуть query_result в структуру и передать ее адрес. Пытался использовать shared_ptr, но он не кастуется в void *. Что делать? |
19.06.2017, 12:50 | #2 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
В аргумент data обычно предполагается передать указатель на какую-то вашу структуру, которую заполнит функция. Можно рассматривать саму ф. калбек, как статик мембер, которому дают указатель на объект (дата).
...сам эту фигню не люблю, в Lua есть подобное, я изменил дефайн калбека на std::function и перекомпилировал - теперь свободно передаются любые ф. и лямбды в луа у меня ...еще в эти сишные ф. можно передать мемберы класса, но с ограничением - прийдется делать через шаблоны и нумеровать их вручную уникально. Вот пример рабочий - лямбда идет в сишный калбек (каждая "новая" такая лямбда, т.е. вызов С ф./ lambdacb::to_callback , должна иметь уникальный ID для всего проекта): Код:
Код:
Последний раз редактировалось alexzk; 19.06.2017 в 13:06. |
19.06.2017, 13:18 | #3 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
В query_result добавить shared_ptr и передавать указатель на query_result, которая должна создаваться и удаляться автоматически, скрыто от пользователя.
|
19.06.2017, 13:21 | #4 | |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Цитата:
Т.е. передавать в ф. указатель просто так нельзя - сразу встает проблема времени жизни в полный рост и отслеживания, например, не удалил ли shared_ptr память, которая для калбека в другом потоке. Хотя, если вызов гарантировано блокирующий (т.е. нет параллельности), то можно и так: Код:
Последний раз редактировалось alexzk; 19.06.2017 в 13:28. |
|
19.06.2017, 13:40 | #5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
|
19.06.2017, 16:43 | #6 |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
>А вот тут жутко черная магия
По-моему, это просто портянка копрокода. Из-за такого когда и говорят о том, что хаскель лучше крестов. А что насчет производительности такого кода по сравнению с аналогом на ФП-языках? |
19.06.2017, 16:54 | #7 | |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Цитата:
Ладно, я че, я нече ) - сам его откуда-то утянул. Но потратил целую ночь, чтобы выгуглить и хотя бы чуть-чуть оценить результаты по запросу "как передать лямбду, как указатель на С функцию". Но работает. Последний раз редактировалось alexzk; 19.06.2017 в 16:58. |
|
19.06.2017, 17:16 | #8 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
|
20.06.2017, 05:04 | #9 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
ну попробуйте смысл в том, что не можем менять "приемник", т..к. это какая-то библиотека, которая хочет указатель. В итоге вы прийдете к вычурной статик-функции, которая будет принимать вашу лямбду + еще что-то, паковать в структуру и передавать в библиотеку + еще 1 статик...и т.д.
Вобщем темплейт выше все это и делает. Последний раз редактировалось alexzk; 20.06.2017 в 05:07. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ошибка при выполнении запроса | dima_r | SQL, базы данных | 6 | 14.04.2011 17:47 |
Try и except при выполнении запроса с ошибкой | Droid | БД в Delphi | 4 | 17.04.2010 19:10 |
Ошибка при выполнении запроса | Шани | БД в Delphi | 4 | 27.07.2007 13:04 |
Ошибка при выполнении запроса | Elena | БД в Delphi | 3 | 14.06.2007 15:13 |
Ошибка при выполнении запроса | Elena | БД в Delphi | 2 | 25.05.2007 16:19 |