| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > приведение указателя на метод в иерархии классов |
| Автор: georain 14.10.2010, 06:56 | ||||
В последней строке ошибка преобразования. Вопрос почему, или как мне зарегистрировать foo как callback:
Ведь метод foo является методом как базового так и производного класса. |
| Автор: mes 14.10.2010, 08:14 | ||
а текст ошибки зачем скрываете ? это не константный указатель, а указатель на константу.. и соответсвенно будет вызывать конфликт в call(..);
|
| Автор: georain 14.10.2010, 20:52 | ||||||
Вы совершенно правы, спасибо большое. Но моя проблема лишь отодвинулась немного дальше. Требуется вызвать шаблонный метод наподобие этого:
Метод объявленный непосредственно в классе Derived вызывается без проблем, а метод из базового класса вызываться не хочет.
Для этого я и пытался сделать приведение, но и этого сделать не удалось:
|
| Автор: mes 14.10.2010, 21:34 | ||
Добавлено через 2 минуты и 23 секунды это в качестве изучения или решаете какую то практическую задачу ? если второе то велосипеды уже изобретены например boost::function, он же (на совр компиляторах) std::(tr1::)function; |
| Автор: georain 15.10.2010, 00:58 | ||
| Спасибо за вариант, но требуется статическая передача указателя для того чтобы компилятор мог сделать inline. В общем случае
И блин, у меня уже целый год пол проекта на этом работает, а тут бац, метод из базового класса передать не могу. В принципе решается то просто, добавлением в нужный класс метода с вызовом метода из базового, но это же ерунда. Занимаюсь распределенными системами и асинхронным выполнением. |
| Автор: georain 15.10.2010, 08:25 |
Оптимизирующие компиляторы. Заинлайненая функция это и не функция, а набор операторов в другой функции. Ладно, не важно для чего это нужно, почему не работает, как задачку решить, я пока не придумал. |
| Автор: boostcoder 15.10.2010, 08:28 | ||
| [offtop] variadic templates? микрософтстудия? у кого есть такой компилятор, скажите пожалуйста, что говорит на такие выражения:
в gcc еще не реализовано :( спасибо. [/offtop] Добавлено @ 08:29 а кто сказал что это функция? сказали что это функция, в кавычках |
| Автор: mes 15.10.2010, 08:35 | ||||||
поэтому я и взял слово функция в кавычки
не понимая цели, трудно предложить варианты. которые Вас устроят
|
| Автор: georain 15.10.2010, 09:04 | ||||||||
Вариативные шаблоны реализованы, http://gcc.gnu.org/projects/cxx0x.html. Gcc 4.4 на приведенный код пишет (кстати три точки надо в другом месте ставить):
mes, ещё раз спасибо за работающий фрагмент. Сейчас у меня цель понять и разобраться, почему не работают некоторые выражения:
и
Например здесь происходит преобразование указателя:
и так как это выражение корректно, то это наводит меня на мысль, что тип метода foo - void(Base::*)(void), и никак не void(Derived::*)(void), хотя Derived все-же содержит в себе этот метод. В этом видимо суть проблемы. То что выражение &Derived::foo возвращает указатель с типом void(Base::*)(void)... |
| Автор: boostcoder 15.10.2010, 09:07 |
что пишет gcc-4.4.* мне не интересно. |
| Автор: georain 15.10.2010, 09:09 | ||
Так ну вроде бы начинает доходить, хотя я это изначально как-то интуитивно воспринимал, поэтому и хотел сделать преобразование
Но почему теперь эту константу в параметр шаблона то не получается загнать. Добавлено через 21 секунду А что интересно? Добавлено через 1 минуту и 31 секунду Если микрософтстудия, то они там ещё не скоро появятся. |
| Автор: mes 15.10.2010, 09:11 | ||
поэтому : ну а тут результат выражения не известен в компильтайм. |
| Автор: djamshud 15.10.2010, 09:11 |
| Не так давно тут был небольшой срач, так вот, по результатм: функция, передаваемая по указателю, вполне может инлайниться в код, если во время компиляции не обнаруживается, что адрес указателя может измениться в рантайме - по сути это условие использования тех же шаблонов; выяснилось также, что такое поведение зависит от компилятора и его версии. |
| Автор: mes 15.10.2010, 09:13 | ||||
потому что это const, а не constexpr (константное выражение) Добавлено @ 09:14
да.. но передача адреса фанкции в шаблон не увеличивает шансы на ее заинлайненость - именно об этом и шла речь выше.. т.е. смысла строить шаблон вместо того чтоб вызвать напрямую, нет, если только там не делается особых проверок .. но тогда варианты с передачей функции как параметра шаблона, так и параметра шаблонной функции равнозначны, при условии передачи ее как констатного выражения.. так как второй вариант может принимать и указатели .. |
| Автор: djamshud 15.10.2010, 09:17 |
| mes, не увеличивает. И более того у меня в гцц-4.4.4 функции, переданные в качестве аргументов шаблонов, вообще никогда не инлайнятся. Что странно. |
| Автор: mes 15.10.2010, 09:19 |
| а тело функции доступно ? |
| Автор: boostcoder 15.10.2010, 09:33 | ||||
вот полный код:
http://liveworkspace.org/code/0662bfe307bb87c42b4a3d2738e1d4fa если кто проверит, буду очень признателен. |
| Автор: georain 15.10.2010, 09:42 | ||||
Дело ещё и в том что мне нужно сгенерировать функцию которая будет принимать указатель на вызываемый метод, и передать её адрес, при этом адрес метода теряется, а хранить и передавать его - это дополнительные расходы в рантайме, пример:
В метод createInquiry я передаю только адрес callback, это 4 или 8 байт, адрес же метода я так не передам потому что типы классов разные, к тому же он может достигать 12 байт в длину, короче это ещё и накладно Добавлено @ 09:49 В общем ClassType должен быть классом, в котором находится метод, что печально А на счет constexpr вы опять правы, но в документации по шаблонам сказано что "параметры шаблона не являющиеся типами могут быть: целочисленный тип или тип перечисления, тип указателя, включая указатели на обычные объекты, функции и члены классов, ссылочный тип (как ссылки на объекты, так и ссылки на функции)" конец цитаты C++ Templates The Complete Guide 2003 Добавлено @ 09:57 кстати, вопрос на засыпку, как из типа указателя на метод класса получить тип класса? это бы очень пригодилось |
| Автор: mes 15.10.2010, 10:02 | ||
|
| Автор: georain 15.10.2010, 10:02 | ||||||
да, проверьте доступно ли тело функции в точке инстанциирования шаблона, и попробуйте inline __attribute__((always_inline)), он кстати что-то пишет если не может проинлайнить Добавлено через 1 минуту и 51 секунду
это понятно, но
доступно в компиль тайм |
| Автор: mes 15.10.2010, 10:15 | ||
неа... значение указателя не является известным_в_компиль_тайм.. не смотря на кажушуюся известность.. в общем сравните два выражения :
Добавлено через 1 минуту и 24 секунды и то что константой можно инициализировать массивы, ничего не говорит.. это обходной трюк, из за неимения альтернативных средств.. |
| Автор: georain 15.10.2010, 10:18 | ||
| =( А ведь такой код верный:
|
| Автор: mes 15.10.2010, 10:45 |
ага верный.. предыдущий пример я привел для понимания разницы.. а верный он благодаря сейчас ... |
| Автор: baldina 15.10.2010, 10:46 | ||
вероятно никак. да и не нужно, т.к. (нестатический) метод может быть вызван только в применении к объекту, а тип объекта в рантайм известен |
| Автор: mes 15.10.2010, 10:57 | ||||||
Добавлено через 14 минут и 20 секунд
если я правильно понял
|
| Автор: georain 16.10.2010, 02:09 | ||
Если я узнаю тип класса из указателя на метод, то смогу подставить его в шаблонный параметр для решения проблемы Вы правильно меня поняли, и теперь я смогу это сделать!
Вы помогли мне разобраться со всеми возникшими вопросами, спасибо большое! |
| Автор: boostcoder 13.1.2011, 00:36 | ||||
так:
http://liveworkspace.org/code/93c11e03d459aa04918545bef566a57d Up. все же static_assert() предоставляемый компилятором, поудобней ;) |