![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
georain |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
В последней строке ошибка преобразования. Вопрос почему, или как мне зарегистрировать foo как callback:
Ведь метод foo является методом как базового так и производного класса. |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а текст ошибки зачем скрываете ? это не константный указатель, а указатель на константу.. и соответсвенно будет вызывать конфликт в call(..);
Это сообщение отредактировал(а) mes - 14.10.2010, 08:18 |
|||
|
||||
georain |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Вы совершенно правы, спасибо большое. Но моя проблема лишь отодвинулась немного дальше. Требуется вызвать шаблонный метод наподобие этого:
Метод объявленный непосредственно в классе Derived вызывается без проблем, а метод из базового класса вызываться не хочет.
Для этого я и пытался сделать приведение, но и этого сделать не удалось:
|
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Добавлено через 2 минуты и 23 секунды это в качестве изучения или решаете какую то практическую задачу ? если второе то велосипеды уже изобретены ![]() например boost::function, он же (на совр компиляторах) std::(tr1::)function; |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Спасибо за вариант, но требуется статическая передача указателя для того чтобы компилятор мог сделать inline.
В общем случае
И блин, у меня уже целый год пол проекта на этом работает, а тут бац, метод из базового класса передать не могу. В принципе решается то просто, добавлением в нужный класс метода с вызовом метода из базового, но это же ерунда. Занимаюсь распределенными системами и асинхронным выполнением. Это сообщение отредактировал(а) georain - 15.10.2010, 01:20 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
![]() Добавлено через 2 минуты и 6 секунд заинлайненая фунция, эта такая "функция" которую не возможно вызвать по адресу, через указатель ![]() ничего противоречивого не замечаете ? ![]() |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
[offtop]
variadic templates? ![]() микрософтстудия? у кого есть такой компилятор, скажите пожалуйста, что говорит на такие выражения:
в gcc еще не реализовано :( спасибо. [/offtop] Добавлено @ 08:29 а кто сказал что это функция? сказали что это функция, в кавычках ![]() Это сообщение отредактировал(а) boostcoder - 15.10.2010, 08:30 |
|||
|
||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
поэтому я и взял слово функция в кавычки ![]()
не понимая цели, трудно предложить варианты. которые Вас устроят ![]()
|
||||||
|
|||||||
georain |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Вариативные шаблоны реализованы, gcc c++0x. Gcc 4.4 на приведенный код пишет (кстати три точки надо в другом месте ставить):
mes, ещё раз спасибо за работающий фрагмент. Сейчас у меня цель понять и разобраться, почему не работают некоторые выражения:
и
Например здесь происходит преобразование указателя:
и так как это выражение корректно, то это наводит меня на мысль, что тип метода foo - void(Base::*)(void), и никак не void(Derived::*)(void), хотя Derived все-же содержит в себе этот метод. В этом видимо суть проблемы. То что выражение &Derived::foo возвращает указатель с типом void(Base::*)(void)... |
||||||||
|
|||||||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Так ну вроде бы начинает доходить, хотя я это изначально как-то интуитивно воспринимал, поэтому и хотел сделать преобразование
Но почему теперь эту константу в параметр шаблона то не получается загнать. Добавлено через 21 секунду А что интересно? Добавлено через 1 минуту и 31 секунду Если микрософтстудия, то они там ещё не скоро появятся. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
Не так давно тут был небольшой срач, так вот, по результатм: функция, передаваемая по указателю, вполне может инлайниться в код, если во время компиляции не обнаруживается, что адрес указателя может измениться в рантайме - по сути это условие использования тех же шаблонов; выяснилось также, что такое поведение зависит от компилятора и его версии.
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
потому что это const, а не constexpr (константное выражение) Добавлено @ 09:14 да.. но передача адреса фанкции в шаблон не увеличивает шансы на ее заинлайненость - именно об этом и шла речь выше.. т.е. смысла строить шаблон вместо того чтоб вызвать напрямую, нет, если только там не делается особых проверок .. но тогда варианты с передачей функции как параметра шаблона, так и параметра шаблонной функции равнозначны, при условии передачи ее как констатного выражения.. так как второй вариант может принимать и указатели .. Это сообщение отредактировал(а) mes - 15.10.2010, 09:18 |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
mes, не увеличивает. И более того у меня в гцц-4.4.4 функции, переданные в качестве аргументов шаблонов, вообще никогда не инлайнятся. Что странно.
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а тело функции доступно ?
|
|||
|
||||
boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вот полный код:
http://liveworkspace.org/code/0662bfe307bb...b4a3d2738e1d4fa если кто проверит, буду очень признателен. |
||||
|
|||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Дело ещё и в том что мне нужно сгенерировать функцию которая будет принимать указатель на вызываемый метод, и передать её адрес, при этом адрес метода теряется, а хранить и передавать его - это дополнительные расходы в рантайме, пример:
В метод createInquiry я передаю только адрес callback, это 4 или 8 байт, адрес же метода я так не передам потому что типы классов разные, к тому же он может достигать 12 байт в длину, короче это ещё и накладно Добавлено @ 09:49 В общем ClassType должен быть классом, в котором находится метод, что печально А на счет constexpr вы опять правы, но в документации по шаблонам сказано что "параметры шаблона не являющиеся типами могут быть: целочисленный тип или тип перечисления, тип указателя, включая указатели на обычные объекты, функции и члены классов, ссылочный тип (как ссылки на объекты, так и ссылки на функции)" конец цитаты C++ Templates The Complete Guide 2003 Добавлено @ 09:57 кстати, вопрос на засыпку, как из типа указателя на метод класса получить тип класса? это бы очень пригодилось Это сообщение отредактировал(а) georain - 15.10.2010, 09:57 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
georain |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
да, проверьте доступно ли тело функции в точке инстанциирования шаблона, и попробуйте inline __attribute__((always_inline)), он кстати что-то пишет если не может проинлайнить Добавлено через 1 минуту и 51 секунду
это понятно, но
доступно в компиль тайм |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
неа... значение указателя не является известным_в_компиль_тайм.. не смотря на кажушуюся известность.. в общем сравните два выражения :
Добавлено через 1 минуту и 24 секунды и то что константой можно инициализировать массивы, ничего не говорит.. это обходной трюк, из за неимения альтернативных средств.. |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
=(
А ведь такой код верный:
Это сообщение отредактировал(а) georain - 15.10.2010, 10:21 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ага верный.. предыдущий пример я привел для понимания разницы.. а верный он благодаря сейчас ... |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
вероятно никак. да и не нужно, т.к. (нестатический) метод может быть вызван только в применении к объекту, а тип объекта в рантайм известен |
|||
|
||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Добавлено через 14 минут и 20 секунд
если я правильно понял ![]()
Это сообщение отредактировал(а) mes - 15.10.2010, 10:57 |
||||||
|
|||||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Если я узнаю тип класса из указателя на метод, то смогу подставить его в шаблонный параметр для решения проблемы Вы правильно меня поняли, и теперь я смогу это сделать!
Вы помогли мне разобраться со всеми возникшими вопросами, спасибо большое! |
|||
|
||||
boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так:
http://liveworkspace.org/code/93c11e03d459...18545bef566a57d Up. все же static_assert() предоставляемый компилятором, поудобней ;) Это сообщение отредактировал(а) boostcoder - 13.1.2011, 03:09 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |