![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
tilin, правильно ли я тебя понял, тебе нужно создавать "задачу", которая в большинстве случаев выглядит как вызов: result = object->method(data)?
Если result всегда одного типа, то рекомендую обратить внимание на boost::bind (для создания "задач") и boost::function (для хранения "задач" в контейнере). Если разных типов, то еще и на boost::any. например, у тебя есть метод int A::method(double x). Ты хочешь его поставить в очередь задач a->method(1.0), тогда boost::bind(&A::method, a, 1.0) создаст тебе объект, который можно вызывать так: o(). Чтобы этот объект чему-нибудь присвоить (пока нет auto из c++0x) можно использовать или шаблоны или boost::function: boost::function<int()> f = boost::bind(&A::method, a, 1.0). Теперь появился функциональный объект f, который можно вызвать так: f(). А вот это уже можно хранить в контейнере (для случая с any):
Это сообщение отредактировал(а) bsa - 28.10.2009, 17:43 |
|||
|
||||
| tilin |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 23.9.2008 Репутация: нет Всего: нет |
Да надо создавать что-то типа задачи, которая хранит объект, метод, параметры вызова и возвращаемое значение. Однако результ может быть совершенно разного типа. В сторону boost-а я уже начал смотреть, но пока с целью ознакомления только лишь. Выложу свое решение, поправьте, если что не то сделал. Списки типов из библиотеки Loki. В Loki NullType.h заменено:
Основная реализация такая:
Макросы только для удобства записи. Пример использования. Func6 для примера без использования макроса SETTYPES:
|
||||||
|
|||||||
| bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
tilin, я тебе дал готовое решение, которое в разы проще и надежней твоего - используй его!
Забыл написать, как добавлять задачи. Допустим, есть менеджер задач, у которого есть метод добавления, объявленный так:
Кстати, начиная с версии 1.35 в boost уже есть менеджер задач! Вот только находится он в неочевидном месте и еще менее очевидно называется. Это boost::asio::io_service. Чтобы с ним работать нужно знать всего два метода: io_service::post() (постановка задачи на асинхронное исполнение), и io_service::run() (выполнение всех задач, пока они есть в очереди; может быть вызван одновременно в нескольких потоках, что приведет к параллельному исполнению задач). |
||||||
|
|||||||
| Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
а еще - функциональней, благодаря полиморфному поведению boost::function, в качестве задач можно использовать не толко ф-ии, но и методы и функторы, твой пример можно переписать вот так:
Добавлено через 4 минуты и 51 секунду кстати, если нет желания использовать boost::asio::io_service, то можно просто сделать не шаблонный класс - наследник Task, у котрого был-бы определен виртуальный метод result, complete и operator() и работать с объектами Task - полиморфно
Это сообщение отредактировал(а) Lazin - 29.10.2009, 16:47 |
||||||
|
|||||||
| tilin |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 23.9.2008 Репутация: нет Всего: нет |
Все понял.
Честно, я понятия не имел, что если сделать вот так
а потом вот так
То в bind будут автоматически определены типы. Я в шоке. Век живи - век учись ) |
||||
|
|||||
| bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Решил свой аналог boost::bind сделать? |
||||||
|
|||||||
| tilin |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 23.9.2008 Репутация: нет Всего: нет |
Просто очень хочется разобраться как делаются такие вещи Вот что получяется. Я в правильном направлении?
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
весь код не смотрел, но судя по этой строке : имхо Вы держите путь в сторону. Это сообщение отредактировал(а) mes - 30.10.2009, 14:27 |
|||
|
||||
| tilin |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 23.9.2008 Репутация: нет Всего: нет |
А вот если добавить сохранение результата в виде Варианта, тогда при получении значения руками преобразования типов делать не надо:
Только в моем варианте dynamic_cast пользуется, поэтому наверное стоит поучиться у boost::any ) В общем вот так получается
|
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |