![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ZeusAtVingrad |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 12.4.2006 Репутация: нет Всего: нет |
Можно ли в C++ описать в базовом классе интерфейс без указания типа (т.е. шаблон?), а в базовых переопределить их - и так, чтобы это получилось полиморфно?
Подробнее: Есть такой код:
Он комплириуется и "работает" (если не считать, что это просто "пробник" и ничего толкового он не делает). Проблема в том, что мне нужно описать класс (или функцию класса) о котором на момент компиляции известно только, что в нём есть функция getA, которая вернёт ссылку (указатель или может вообще объект) типа А.
Но А - это же шаблон. Его же нельзя просто так написать как возвращаемый функцией результат. А какой именно тип вернёт getA будет зависеть от того экземпляр какого класса-наследника Test вызовут: Ну и естественно "пользователь" этого ничего знать не должен. Ему дали указатель (ссылку) на Test, он вызывает getA.... и вот тут тонкость: ВЫЗЫВАЮЩИЙ код - ЗНАЕТ какой именно тип вернёт getA. Но как это расписать в виде классов-шаблонов - ума не приложу. Спасибо. Это сообщение отредактировал(а) ZeusAtVingrad - 19.4.2013, 15:09 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
в принципе см. boost::any или variant.. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Интересно... у меня де-жа-вю или это ты на куче форумов одно и то же спрашиваешь ?
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
иногда все ж допустимы
|
||||
|
|||||
| ZeusAtVingrad |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 12.4.2006 Репутация: нет Всего: нет |
1. Я понимаю, что много воды, но как-то трудно сформулировать...
Если просто словами, то - надо сделать базовый класс (шаблонизированный?) в котором тип ВОЗВРАЩАЕМОГО функцией значения будут "знать" только наследники и только тот, кто вызывает этого наследника. Опять-таки, вызывающий код НЕ ЗНАЕТ какого именно наследника он вызывает (т.е. у него есть указатель или ссылка только на базовый класс и объявление класса наследника у него нет - ну типа полиморфизм), но при этом он всё-таки ЗНАЕТ, ЧТО именно ему вернут. Он не знает КТО вернёт, но знает ЧТО вернут. 2. Знаю, что возвращаемое значение не входит в сигнатуру функции. Код который я привёл это как бы семантический пример. Понятно, что это не рабочий C++ код. 3. Знаю, что такого рода дела можно решать через всяческого рода any (boost::any например). Но во-первых не хочется для небольшого проекта тянуть зависимость от boost, во-вторых подозреваю, что any_cast'ы всякие могут работать довольно медленно. А есть желание получить максимально быстрый код. Поэтому - статические проверки типов и/или приведение указателей по линии наследования. Но не проверка и приведение какого-то void* к любому типу. 4. На http://stackoverflow.com не мой вопрос. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
boost:any тянуть не обязательно, можно быстренько написать свой аналог.. any это всего лишь концептуальная обертка над void*, позволяюшая легко хранить и копировать объект.. если проверка на валидность каста не нужна (не такое уж и длительное, сравнение например по type_id), то подойдет обычный static_cast. так это база любого преобразования в с++ |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
mes, cенкс. хмм.. действительно... Переобъявить возвращаемый тип как ссылку или указатель на наследника, оказываецца можно... Но от необходимости каста мы, все равно, никуда не денемся.
Добавлено через 1 минуту и 53 секунды Вообще, кастовать, а следовательно брать на себя всю работу по слежению за полиморфными типами. "кабаки да бабы доведут до цугундера" (с)... |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не следовательно.. Добавлено через 2 минуты и 45 секунд
не важно как объявили в наследниках, важно то с чем работаем.. а IGet возвращает A&.. Добавлено через 4 минуты и 6 секунд чуть позже напишу пример ) Это сообщение отредактировал(а) mes - 21.4.2013, 12:18 |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
http://codepad.org/legyGq8B
Это сообщение отредактировал(а) mes - 21.4.2013, 19:24 |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |