![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
DarkKnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
Здравствуйте! Возникла необходимость получить тип класса, при передаче указателя на его метод в шаблонный класс. Такой вот код:
Собственно необходимо как-то заставить MethodContainer вычислять тип Т метода М(класса Т) при создании. Но как это сделать? Это сообщение отредактировал(а) DarkKnight - 17.12.2013, 13:29 |
|||
|
||||
DarkKnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
Есть вариант сделать абстрактный класс IObject, определив в нем необходимые общие методы, а Object унаследовать от IObject и сделать его полностью шаблонным. Я недавно только до этого додумался,к сожалению, и это работает =)
Но может быть кто-то все же знает как решить изначально поставленную задачу? Это сообщение отредактировал(а) DarkKnight - 17.12.2013, 14:14 |
|||
|
||||
vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Простейший вариант, в котором нужно задавать конструктор для каждой сигнатуры функции:
С использованием C++11, позволят передавать функции любой сигнатуры:
Как тебе это использовать? Тебе решать; можно сделать функцию-создатель твоего класса, можно еще как-то. Варианты есть, нужно просто выбрать подходящий. P.S. А зачем тебе этот класс? std::function чем не устраивает?(или boost::function) |
||||
|
|||||
DarkKnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
Спасибо за решение, но к сожалению C++11 у нас нет, пишем под МСВС , там gcc 4.1.3, приходится забыть про auto, decltype и другие прелести) А вариант с конструктором для каждой сигнатуры функции не подходит, к сожалению =(
Изначально я и хотел использовать boost::function, но не получилось, а все потому что мне нужно передавать в luabind тип класса, объект, и указатель на метод. Как я понял, boost::function оставляет тип класса где-то у себя в недрах, и получить его позже не получится. И нужно, чтобы можно было забиндить любое количество методов объекта, и методы могут быть совершенно разные. Я в общем то решил проблему так,как писал выше, правда обнаружились другие, уже касательно самой luabind, но с ними вроде тоже разобрался - тестирую. Интересует сам факт возможности решения задачи таким подходом, ведь мало ли где еще может пригодиться =) А в интернете к сожалению решения такого я не нашел.. Это сообщение отредактировал(а) DarkKnight - 18.12.2013, 09:37 |
|||
|
||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
А corba у вас нет чтоли?
-------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
DarkKnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
Википедия говорит, что это стандарт написания распределенных приложений. Возможно я чего-то не понимаю, поясните пожалуйста, причем тут CORBA? У меня взаимосвязь между Lua и C++ происходит внутри одной библиотеки, на клиенте. |
|||
|
||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Пардон, почитал немного и понял, что Lua уже использует Corba архитектуру и в ней есть LuaORB (брокер Corba). Corba это аналог COM-технологий. Точнее, наоборот, сначала стали развивать Corba, и лишь затем, кажется, ActiveX и COM. просто у тебя в задаче, как я понял, часть функционала, которую представляют эти технологиию А по Lua я не был в курсе и чёрт меня под локоть дёрнул свой вопрос написать ![]() -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
DarkKnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
ничего страшного, зато я узнал интересную для себя информацию ![]() |
|||
|
||||
Lukkoye |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 23.3.2013 Репутация: 1 Всего: 1 |
Если сигнатуры функций-методов целей заранее не известны, то можно: 1. Использовать механизм Connector, который не является шаболонном класса. (обычный класс). Поэтому, нет проблем хранить в массивах. Динамический коннектор специально был разработан для решения подобных задач. Умеет нацеливаться на любые функции или методы классов. Пенальти: в дебаг-версии проверка на ошибки происходит в рантайме, что отражается на скорости работы. в релиз-версии проверки не выполняются. Теряется безопасность. 2. Использовать boost::function/std::function. В связке с boost::any. Так например, метод любой сигнатуры всегда можно привести к универсальному виду: std::function<boost::any(boost::any)> Пенальти: теряется контроль за ошибками времени компиляции. Медленно, и не экономично. Рекомендуется смотреть в сторону пункт 1. Если сигнатура только одна и она заранее известна: 1. Использовать boost::function/std::function Пенальти: отсутствуют. Если сигнатуры функций-методов целей известны заранее: 2. Использовать связку boost::function/std::function и boost::variant Пенальти: отсутствуют. |
|||
|
||||
DarkKnight |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
Спасибо за развернутый ответ. Идеи, конечно, хорошие - не нужно будет городить свой огород из контейнеров для функторов и код в этом случае должен быть понятен тогда другим программистам, но: 1. Нет гибкости - продукт активно развивается, и проектов много. Иногда под какой то конкретный проект приходится что-то менять, и в этом случае повышались бы шансы изменения кода под определенные проекты, хотя это библиотека, которая не должна зависеть от проекта. Добавить пару сигнатур, конечно, не проблема, но все же.. 2. Это compile-time, что не очень хорошо. В общем то, если бы у меня так и не получилось ничего,я бы скорее всего и воспользоваля одним из предложеных вариантов из топика. Но подумав еще немного, я понял, что слишком всё усложнил, и всё переделал.
Интерес был в том, чтобы создать именно такой шаблон, который принимал бы на вход любой метод любого класса,и от него можно было бы получить тип самого класса. Просто ведь понятно, что у компилятора информация такая есть, впрос только как ее получить? |
||||||
|
|||||||
Lukkoye |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 23.3.2013 Репутация: 1 Всего: 1 |
От компилятора - никак. Все существующие на сегодняшний день механизмы разруливают этот момент с помощью шаблонов. С появлением с++11 variadric templates это стало относительно не сложно. Но если вам критична поддержка с++03, то вам придется реализовать шаблон с кучей специализаций под все возможные ситуации. Например, механизм Connector для этих целей использует вспомогательный механизм Info_Function Использование которого может быть вида:
Info_Function это шаблон, который имеет кучу специализаций под все возможные сигнатуры функций или методов в с максимальным количеством аргументов до 7 штук включительно. Это достаточно объемный файл, хотя сам механизм очень простой, его идея:
И так под все возможные ситуации для 7 аргументов включительно. Другого способа в рамках с++03 не существует. Если глянуть в тот же буст - там это разруливается при помощи boost.preproseccor. Смысл тот же, только буковок меньше, и читабельность на нуле. Это сообщение отредактировал(а) Lukkoye - 22.12.2013, 20:53 |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |