![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
всем доброго дня.
имеем тип T:
в runtime мы получаем id`ы. хочу реализовать что-то вроде типозависимого прокси callable`ра(хз как правильно назвать). сигнатура методов/объектов такая:
нужна возможность регистрировать методы/объекты имея в runtime только id, и ин compile_time T::id. т.е. зная T::id ат compile_time и id в runtime, назначать методы/объекты принимающие соответствующие им типы. пример конечного использования:
как-то так... запутался, и ничего в голову не лезет... Это сообщение отредактировал(а) boostcoder - 3.4.2011, 01:58 |
||||||
|
|||||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
IMHO сие невозможно. Либо id должен быть известен в compile time, либо реализация proxy вообще не должна зависеть от id Либо я не понял требования задачи - что с чем и по каким признакам надо связать? Во что должен развернуться
|
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
это разные числа , или одно и то же ? |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
если id == type1::id, то должен произойти вызов method1(...) int id имеет диапазон type1::id ... typeN::id два уточнения: 1. typeN::id - это enum. так что можно использовать в mpl. 2. у всех typeN общий предок. Это сообщение отредактировал(а) boostcoder - 6.10.2010, 17:21 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
было б лучше если б дали немного сведений и о задачи, а именно какие требования предъявляются к рантайм..
вот на полусне : http://liveworkspace.org/code/c8cf16a805aa...0bc837af0545038 в том хоть направлении ? Добавлено через 3 минуты и 27 секунд это Вы удаленный вызов реализуете ? Добавлено через 5 минут и 19 секунд а что ж тогда не объект класса typeN передается ? |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
в параметрах должны быть типы или значения соответствующих типов? -------------------- qqq |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
так же удобство структуры в возможности легкой (мета ориентированной) регистрации ,
т.е. для неперегруженных функций достаточно только передать имя функции :
подправленная версия : http://liveworkspace.org/code/3b42cd08948e...84cf01e63c3374e |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
можно упаковывать полученные аргументы в boost::any
а методы оборачивать во что-то шаблонное, унаследованное от общего интерфейса (который и принимает эти boost::any) Добавлено через 55 секунд (правда, не получится пользоваться неявными преобразованиями) -------------------- qqq |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
в примере обработчиками выступают функции, но у конечному пользователь захочется иметь что либо более универсальное..поможет класс Dispatchera, для конвертации параметра и класс функции (напр boost::function)
http://liveworkspace.org/code/09b6daf1e59d...aee0c15a1aff76d на "ляпы" не относящиеся к сути проблемы (такие как неподходящий способ хранения) внимания не обращать ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
кстати вспомнил, goldfinch одно время на форуме разбирал темы связанные с удаленными вызовами..
не помню к чему он там конкретно пришел, но думаю Вам будет тематически полезно ознакомиться с этим материалом.. если найдете прикрепите ссылки к теме, плиз ![]() |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
я даже аккаунта такого не могу найти. и функцию поиска аккаунтов тоже :( пока курю ваш пример. хочется автоматизировать это все. написать кодогенератор на препроцессоре - не проблема. но есть несколько неудобных моментов. думаю... Это сообщение отредактировал(а) boostcoder - 9.10.2010, 03:12 |
|||
|
||||
boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mes, сделал так, как вы предложили:
используется это дело так:
метод proxy_caller::call() вызывается из сетевой части после того, как буфера на которые ссылается proxy_caller заполнены. как видно из реализации метода methods_dispatcher::dispatch(), ответ отправляется обратно при выходе из тела этого метода. не худшая реализация RPC из тех что я видел ![]() но хочется большего. а именно: скрыть от юзера все, кроме самого implementation. в идеале, цель хочу видеть такой:
но тут есть непонятка... т.к. клиент, всего лишь дергает методы сервера, ему их реализация не нужна. но она нужна серверу. вот и непонятка: что на самом деле нужно на стороне клиента, чтоб дергать методы сервера? и что нужно знать серверу, чтоб понять, какой именно метод вызывает клиент? |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну проще было искать тему, и поставить ограничение по юзеру.. вобщем вот об этой я говорил : http://forum.vingrad.ru/forum/topic-269086...tml#st_0_view_0 Это сообщение отредактировал(а) mes - 9.10.2010, 10:53 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |