![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| d06osipov |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
У меня есть функция, определённая примерно так:
Если мне нужно, чтобы для типа f(float) работала по другому, я напишу так:
А как мне сделать, чтобы эта функция работала по другому для всех производных типов от данного типа? Есть ли подходящий паттерн? Иначе говоря, если, например, class B и class C наследуются от class A, то f<B> и f<C> это одна функция, а f<int> --- другая. |
||||
|
|||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
зачем здесь шаблон? можно обойтись перегрузкой...
в принципе есть такой вариант:
но если ты будешь работать с этими классами полиморфно то это не будет работать...
Это сообщение отредактировал(а) Lazin - 30.4.2008, 20:11 |
||||
|
|||||
| d06osipov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
||||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
перегрузи функцию, если ты напишешь
то это избавит тебя от некоторых проблем связанных с разрешением перегрузки... |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| d06osipov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
Слишком много и т. д.. int бывают разной длины, знаковые, не знаковые, и плюс мои типы. Спасибо. Там решения нет но есть сообщение: "есть же шаблоны, что говорят, является ли тип наследником другого" Если бы у меня был такой шаблон, проблема бы решилась! |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
google(loki), к примеру. Loki - одна из библиотек, в которой этот шаблон был определён. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
такой шаблон есть в библиотеке Loki (Макрос SUPERSUBCLASS) а описание принципа работы можно прочитать в книге А. Александресску "Современное проектирование на С++" пар. 2.7. Распознавание конвертируемости и наследования на этапе компиляции. |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Правильней всего такой шаблон определён в Boost. У Александреску реализация примитивная и не лишена изъянов.
Это сообщение отредактировал(а) UnrealMan - 30.4.2008, 22:27 |
|||
|
||||
| d06osipov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
||||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
библиотека type traits
Добавлено @ 22:33 is_base_of правда не могу сказать чем отличается от Loki Это сообщение отредактировал(а) Lazin - 30.4.2008, 22:33 |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Способ Рани Шарони (Rani Sharoni) корректно определяет наследование в случае неоднозначных и закрытых базовых классов, в отличие от способа Александреску.
Это сообщение отредактировал(а) UnrealMan - 30.4.2008, 22:53 |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
А тут тогда появляются варианты... ибо закрытое наследование - "не совсем" наследование (в плане невозможности приведения потомка к базовому классу). |
|||
|
||||
| d06osipov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
Всем спасибо за ответы. Мне такой сумасшедшей общности как в Boost не нужно, а Boost я не могу использовать в своей программе (такие требования).
Сделал как в Александреску и всё работает. Примерно так:
Это сообщение отредактировал(а) d06osipov - 1.5.2008, 01:20 |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Метод Александреску без вариантов выдаст ошибку компиляции, хотя от него требовалось получение константы. Если интересует возможность приведения указателя одного типа к указателю другого типа, то нечего говорить о наследовании. В конце концов, int не является наследником void
Это попросту не соответствует действительности. Ну, способ Шарони можно отыскать и без Boost: http://forum.sources.ru/index.php?showtopi...t&p=1760969 Другое дело, что некоторые компиляторы из-за их несоответствия стандарту могут не скомпилировать такой код. Для таких компиляторов в Boost есть workaround-ы. Это сообщение отредактировал(а) UnrealMan - 1.5.2008, 12:35 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |