Форум программистов, компьютерный форум CyberForum.ru

Явная специализация - C++

Восстановить пароль Регистрация
 
Warbit
1 / 1 / 0
Регистрация: 06.12.2012
Сообщений: 9
31.12.2012, 15:38     Явная специализация #1
Здрасти, Народ.
Подскажите плз в чем преимущество явной специализации перед перед обычным применением перегруженной функции. Привожу код:
1)
C++
1
2
3
4
5
6
7
8
//функция меняет значения параметров
template <typename T>
void swap(T &a, T &b)
{
   T temp = a;
   a = b;
   b = temp;
}
2)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct job
{
  char name[20];
  int floor;
  double salary; 
}
//функция меняет значения salary и floor
template <>
void swap<job>(job &a, job &b)
{
  int t1 = a.floor;
  a.floor = b.floor;
  b.floor = t1;
  double t2 = a.salary;
  a.salary = b.salary;
  b.salary = t2;
}
Так вот, ведь я бы мог просто написать явно перегруженную вторую функцию без всяких там шаблонов и специализаций и программа все равно будет рабочей.
В чем же цимус явной специализации перед обычной перегрузкой???
PS прошу прощения за коряво поданный вопрос.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
31.12.2012, 16:03     Явная специализация #2
Перегруженная нешаблонная функция задаёт полный и исчерпывающий перечень типов, для которых она реализована. Если вы перегрузите нешаблонную swap для int, job и bork, то только эти типы она и сможет принимать.

Явная специализация шаблонной функции задаёт полный и исчерпывающий список типов, для которых функция будет вести себя не так, как написано в шаблоне. Если вы специализируете шаблонную swap для int, job и bork, то только для этих типы она будет вести себя так, как написано в специализациях, а для остальных — как написано в шаблоне.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
31.12.2012, 16:07     Явная специализация #3
Warbit, я бы сказал так - для единообразия в коде.
Представьте, что у вас в коде есть шаблон и вместо явной его специализации была написана перегруженная функция с таким же именем. Затем по каким-то причинам вам нужно поменять что-то в шаблоне - имя, типы параметров, саму логику внутри. Вы в шаблоне все поменяли, а про перегруженную функцию забыли. Причем компилятор на это ругаться не будет. Соответственно, это может стать причиной ошибок. Поэтому если используете шаблоны - используйте их полноценно.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
31.12.2012, 22:37     Явная специализация #4
Цитата Сообщение от Warbit Посмотреть сообщение
Так вот, ведь я бы мог просто написать явно перегруженную вторую функцию без всяких там шаблонов и специализаций и программа все равно будет рабочей.
В данном случае специализация не нужна ... достаточно перегрузить оператор присвоения, для корректного обмена
(в случае наличия например динамических объектов в структуре)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
01.01.2013, 12:27     Явная специализация #5
Преимущество шаблонов в том, что если текст функции совпадет во всех перегруженных версиях, а различаются только типы данных, с которыми выполняются одни и те же операции, то можно во-первых съэкономить размер текста за счёт одного экземпляра текста функции, а во-вторых застраховаться от ошибок при изменении поведения сразу всех функций: менять то тоже надо один экземпляр и невозможно забыть исправить один экземпляр из десяти. Других преимуществ шаблоны не имеют, они лишь позволяют реализовать единобезобразие ровно один раз и не мучаться, но компилятор создаст те же самые перегруженные версии функции с идентичным текстом и аналогичные друг другу классы.
Warbit
1 / 1 / 0
Регистрация: 06.12.2012
Сообщений: 9
02.01.2013, 18:56  [ТС]     Явная специализация #6
меня просто интересует, есть ли такой случай, когда пригодилась бы именно явная специализация, а не явная перегрузка функции. Из учебной литературы я я таких примеров не нашел.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2013, 19:19     Явная специализация
Еще ссылки по теме:

Явная специализация шаблона C++
C++ Явная специализация шаблонного класса
C++ Явная специализация шаблонов

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
02.01.2013, 19:19     Явная специализация #7
Почти всё шаблонная магия основывается на частичной специализации, например.

Ну и опять повторюсь: если алгоритм реализуется "для всего, что можно", но для некоторых по-другому, то это частичная специализация. Если только для некоторых типов и только для них, то это перегрузка.

Банальный пример "для всего, что можно, но для некоторых по-другому": изменение размеров каких-нибудь векторов. POD-типы можно просто memcpy() скопировать, а все остальные надо копировать/перемещать через соответствующие конструкторы.
Yandex
Объявления
02.01.2013, 19:19     Явная специализация
Ответ Создать тему
Опции темы

Текущее время: 01:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru