Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонная функция для данного типа, Специализация шаблонный функции 
V
    Опции темы
d06osipov
Дата 30.4.2008, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



У меня есть функция, определённая примерно так:
Код

template<class T>
int f(const T& t)
{ return 1;
}


Если мне нужно, чтобы для типа f(float) работала по другому, я напишу так:
Код

template<>
int f<float>(const float& t)
{ return 2;
}


А как мне сделать, чтобы эта функция работала по другому для всех производных типов от данного типа? Есть ли подходящий паттерн?

Иначе говоря, если, например, class B и class C наследуются от class A, то f<B> и f<C> это одна функция, а f<int> --- другая.
PM MAIL   Вверх
Lazin
Дата 30.4.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



зачем здесь шаблон? можно обойтись перегрузкой...

в принципе есть такой вариант:

Код

class A {};

class Base : public A {};

class B : public Base {};

class C : public Base {};

....
int f(const Base&)
{ 
    return 3;
}


но если ты будешь работать с этими классами полиморфно то это не будет работать...
Код

С с;
A& refс = c;
f(refc);//<---вот здесь будет вызвана ф-я f(const A&) если она конечно есть...


Это сообщение отредактировал(а) Lazin - 30.4.2008, 20:11
PM MAIL Skype GTalk   Вверх
d06osipov
Дата 30.4.2008, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Lazin @  30.4.2008,  20:09 Найти цитируемый пост)
int f(const Derived&)
{ 
    return 3;
}

Это хорошо, но мне нужно, чтобы ещё была определена f(int), f(double), и f от вообще любого типа, не являющегося Derived.

Отговорки "Назови по другому" не годятся, т. к. f это на самом деле оператор.
PM MAIL   Вверх
Lazin
Дата 30.4.2008, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



перегрузи функцию, если ты напишешь 

Код

int f(int);
int f(long);
int f(const Base&);
итд


то это избавит тебя от некоторых проблем связанных с разрешением перегрузки...
PM MAIL Skype GTalk   Вверх
mes
Дата 30.4.2008, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250





--------------------
PM MAIL WWW   Вверх
d06osipov
Дата 30.4.2008, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Lazin @  30.4.2008,  20:16 Найти цитируемый пост)
int f(int);
int f(long);
int f(const Base&);
итд

Слишком много  и т. д.. int бывают разной длины, знаковые, не знаковые, и плюс мои типы.


Цитата(mes @  30.4.2008,  21:01 Найти цитируемый пост)
http://forum.vingrad.ru/forum/topic-196793.html#st_15_view_0 

Спасибо. Там решения нет но есть сообщение:
"есть же шаблоны, что говорят, является ли тип наследником другого"
Если бы у меня был такой шаблон, проблема бы решилась!

PM MAIL   Вверх
JackYF
Дата 30.4.2008, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(d06osipov @  30.4.2008,  21:00 Найти цитируемый пост)
Если бы у меня был такой шаблон, проблема бы решилась!

google(loki), к примеру. Loki - одна из библиотек, в которой этот шаблон был определён.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Lazin
Дата 30.4.2008, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(d06osipov @  30.4.2008,  22:00 Найти цитируемый пост)
Если бы у меня был такой шаблон, проблема бы решилась!

такой шаблон есть в библиотеке Loki (Макрос SUPERSUBCLASS)
а описание принципа работы можно прочитать в книге А. Александресску "Современное проектирование на С++" пар. 2.7. Распознавание конвертируемости и наследования на этапе компиляции.  smile 


PM MAIL Skype GTalk   Вверх
UnrealMan
Дата 30.4.2008, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Правильней всего такой шаблон определён в Boost. У Александреску реализация примитивная и не лишена изъянов.

Это сообщение отредактировал(а) UnrealMan - 30.4.2008, 22:27
PM MAIL   Вверх
d06osipov
Дата 30.4.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(UnrealMan @  30.4.2008,  22:23 Найти цитируемый пост)
Правильней всего такой шаблон определён в Boost


А в какой конкретно библиотеке?
PM MAIL   Вверх
Lazin
Дата 30.4.2008, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



библиотека type traits

Добавлено @ 22:33
is_base_of
правда не могу сказать чем отличается от Loki  smile 

Это сообщение отредактировал(а) Lazin - 30.4.2008, 22:33
PM MAIL Skype GTalk   Вверх
UnrealMan
Дата 30.4.2008, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Способ Рани Шарони (Rani Sharoni) корректно определяет наследование в случае неоднозначных и закрытых базовых классов, в отличие от способа Александреску.

Это сообщение отредактировал(а) UnrealMan - 30.4.2008, 22:53
PM MAIL   Вверх
JackYF
Дата 1.5.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(UnrealMan @  30.4.2008,  21:50 Найти цитируемый пост)
закрытых базовых классов

А тут тогда появляются варианты... ибо закрытое наследование - "не совсем" наследование (в плане невозможности приведения потомка к базовому классу).


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
d06osipov
Дата 1.5.2008, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Всем спасибо за ответы. Мне такой сумасшедшей общности как в Boost не нужно, а Boost я не могу использовать в своей программе (такие требования). 

Сделал как в Александреску и всё работает. Примерно так:

Код

/*
 * IsBase<T,S>::Value истино если и только если
 * T является public предком для S.
 * 
 * Спроектирован на основе алгоритма из Александреску
 */

template<class Base,class Derrivive>
class IsBase
{ struct Big
    { int a;int b;
    };
    struct Small
    { int a;
    };
    static Big   f(Base*){}
    static Small f(void*){}
public:
    static const bool Value=sizeof(f((Derrivive*)(NULL)))==sizeof(Big);
};

template<class T,bool IsA=IsBase<A,T>::Value >
class Tmp
{
};


Это сообщение отредактировал(а) d06osipov - 1.5.2008, 01:20
PM MAIL   Вверх
UnrealMan
Дата 1.5.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(JackYF @  1.5.2008,  01:03 Найти цитируемый пост)
А тут тогда появляются варианты... 

Метод Александреску без вариантов выдаст ошибку компиляции, хотя от него требовалось получение константы.

Цитата(JackYF @  1.5.2008,  01:03 Найти цитируемый пост)
в плане невозможности приведения потомка к базовому классу

Если интересует возможность приведения указателя одного типа к указателю другого типа, то нечего говорить о наследовании. В конце концов, int не является наследником void smile

Цитата(d06osipov @  1.5.2008,  01:08 Найти цитируемый пост)
 * IsBase<T,S>::Value истино если и только если
 * T является public предком для S.

Это попросту не соответствует действительности.

Цитата(d06osipov @  1.5.2008,  01:08 Найти цитируемый пост)
Boost я не могу использовать в своей программе 

Ну, способ Шарони можно отыскать и без Boost:
http://forum.sources.ru/index.php?showtopi...t&p=1760969

Другое дело, что некоторые компиляторы из-за их несоответствия стандарту могут не скомпилировать такой код. Для таких компиляторов в Boost есть workaround-ы.


Это сообщение отредактировал(а) UnrealMan - 1.5.2008, 12:35
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.