Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Замыкания C++ и связь с C callback-ми |
Автор: jonie 14.1.2011, 10:43 | ||||||||
Пусть у нас есть Сишный код:
и нам надо такой код превратить в класс С++ (стандартная, кстати задача):
В коде в месте (1) нам нужно начать работу с callback. Естественно, что указанный калбэк должен быть статическим и тем самым в непосредственно реализации этой функции мы не имеем this. Вопрос: как сделать так, чтобы в нашем callback мы могли бы получить this того объекта, который производил регистрацию? * *) например в C# можно использовать замыкания вроде
Но как такое сделать в C++ при указанный условиях что-то не дохожу... Недорешение: мы можем сделать связку сишного контекста (int) с Ctx* используя нечто вроде
и при регистрации в Ctx::Start() добавлять в карту маппинг, но это как-то уныло. |
Автор: azesmcar 14.1.2011, 10:48 | ||
jonie А в чем проблема передать this как аргумент в callback например с помощью boost::bind? Конечно, придется немного модифицировать функцию RegisterCallback и сделать ее шаблонной, но думаю ничего страшного.
|
Автор: jonie 14.1.2011, 11:34 |
ага, callback нужен для сишной функции и только для неё. Модифицировать Сишный код никак нельзя. void* userObject - такого Сишная либа не предусматривает (см. выше). Еслиб можно было - не было бы проблем - именно как тут http://liveworkspace.org/code/f3ee5f16c898d92b8b005f46d06d1339 яб и сделал не думая 8) Еще раз для понимая: всё что есть это контекст, который также создается Си либой. И это внутренее "нечто" этой либы. если говорить про C# код, то подойдет и будет работать. Я вроде не ошибаюсь в этом месте... Еще варианты? Вот тут чувак пишет что ниче у меня не выйдет (первый ответ): http://stackoverflow.com/questions/2001604/class-member-function-as-callback-using-boostbind-and-boostfunction |
Автор: mes 14.1.2011, 11:38 |
так Вам для Сишной функции надо то ![]() так какие параметры предусмотрены ? если никаких, то по какому принципу отражать на множество объектов ? а если нужно на один, то решается просто - заведите статическую переменную под нужный this.. Добавлено @ 11:44 там Вы привели совсем другую функцию.. ![]() для ответа на ваш вопрос нужно знать, что есть эти параметры на самом деле.. в общем Вам нужно определить есть ли среди параметров такой, вместо которого можно подсунуть this... |
Автор: jonie 14.1.2011, 11:45 | ||||
этот метод я описывал в топике под именем "Недорешение" .. ну да, наверно иначе и никак не получится... ведь в функции я действительно никак не узнаю о this как бы не старался. Хотя C# вот как-то выкручивается.. надо почитатьс как он это делает. Наверно такой же метод использует в конечном итоге. |
Автор: mes 14.1.2011, 11:50 |
тогда нужно определиться : во первых там описано другое, во вторых способов со статической переменной несколько.. точнее способ то в принципе один, восприятий несколько.. |
Автор: mes 14.1.2011, 12:17 | ||
например, можно на каждый адрес функции колбяка отразить свой делегат... вот пример для размышления и допиливания под свои нужды : http://liveworkspace.org/code/47d75b234a075cd3e8c569f74af6a251 |
Автор: jonie 14.1.2011, 12:19 |
ну я собственно так и сделал у себя, но мне чет не особо понравилось 8) |
Автор: mes 14.1.2011, 12:20 | ||
ну а поконкретней, чего не понравилось то ? Добавлено через 3 минуты и 34 секунды если Вы об этом
то это совсем другое.. в примере нет (ран-тайм) карты и ассоциация метода идет к адресу функции колбяка... |
Автор: mes 14.1.2011, 12:54 |
вот еще вариантик: http://liveworkspace.org/code/eddee3669c8a4eb3414f172d741cf696 с тем ограничением, что переменная функции должна иметь внешнее связывание.. (т.е.грубо говоря должна быть определена вне функционального блока) |
Автор: azesmcar 14.1.2011, 13:29 |
т.е. даже добавлять аргумент в callback нельзя? тогда единственный вариант - получить указатель из какого нибудь глобального контейнера, т.е. ![]() |
Автор: jonie 14.1.2011, 13:29 | ||||
ну это понятно. Я имел в виду что в общем связь хранится в неком статической внешней (по отношениею к создавающему объекту) переменной. А вот что хранится ней: указатель ли на объект или указатель на функцию в этом объекте на самом деле не важно. этак можно и до boost::signals2 дойти ) |
Автор: mes 14.1.2011, 13:45 | ||||
ну так естественно, если нет (подходящего) параметра, то нужна связь.. вопрос в том какой род связи подойдет лучше для задачи ![]() Добавлено через 2 минуты и 51 секунду
это да.. вопрос не в том, что хранится, а к чему ассоциировано то, что хранится.. Добавлено через 5 минут и 10 секунд можно и во внутренней.нужно только знать об отношении колбяка к объекту.. а об этом, по той части информации что Вы привели, догадаться не возможно.. |