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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Warbit
1 / 1 / 0
Регистрация: 06.12.2012
Сообщений: 9
#1

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

31.12.2012, 15:38. Просмотров 676. Ответов 6
Метки нет (Все метки)

Здрасти, Народ.
Подскажите плз в чем преимущество явной специализации перед перед обычным применением перегруженной функции. Привожу код:
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 прошу прощения за коряво поданный вопрос.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.12.2012, 15:38     Явная специализация
Посмотрите здесь:

явная специализация - C++
нужно реализовать специализацию по шаблону. Специализация должна принимать массив строк, и вернуть наибольшую строку. template...

Явная специализация шаблона - C++
Здравствуйте. Не совсем разобрася с сабжем. Например, если есть кусочек кода: template &lt;typename T&gt; void func(T &amp;blue, T &amp;red); ...

Явная специализация шаблона - C++
Здравствуйте, подскажите, пожалуйста, почему не выполняется неявное приведение фактических параметров к формальным при вызове функции для...

Явная специализация класса - C++
Код переписан из книги, однако не компилируется. Что не так со специализацией класса? // Явная специализация класса. #include...

Явная специализация шаблона - C++
Столкнулся с проблемой при изучении шаблонов. Задача: написать шаблонную функцию, которая принимает в качестве аргумента массив...

Явная специализация шаблонов - C++
В явной специализации мы можем задать поведение функции для конкретного типа данных. Мне например хочется сделать явную специализацию для...

Явная специализация шаблонного класса - C++
Всем привет, не могу разобраться с определением функций-членов для явной специализации Имеем след. код: template &lt;class Type&gt; class A...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
31.12.2012, 16:03     Явная специализация #2
Перегруженная нешаблонная функция задаёт полный и исчерпывающий перечень типов, для которых она реализована. Если вы перегрузите нешаблонную swap для int, job и bork, то только эти типы она и сможет принимать.

Явная специализация шаблонной функции задаёт полный и исчерпывающий список типов, для которых функция будет вести себя не так, как написано в шаблоне. Если вы специализируете шаблонную swap для int, job и bork, то только для этих типы она будет вести себя так, как написано в специализациях, а для остальных — как написано в шаблоне.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
31.12.2012, 16:07     Явная специализация #3
Warbit, я бы сказал так - для единообразия в коде.
Представьте, что у вас в коде есть шаблон и вместо явной его специализации была написана перегруженная функция с таким же именем. Затем по каким-то причинам вам нужно поменять что-то в шаблоне - имя, типы параметров, саму логику внутри. Вы в шаблоне все поменяли, а про перегруженную функцию забыли. Причем компилятор на это ругаться не будет. Соответственно, это может стать причиной ошибок. Поэтому если используете шаблоны - используйте их полноценно.
Avazart
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,402
Записей в блоге: 17
31.12.2012, 22:37     Явная специализация #4
Цитата Сообщение от Warbit Посмотреть сообщение
Так вот, ведь я бы мог просто написать явно перегруженную вторую функцию без всяких там шаблонов и специализаций и программа все равно будет рабочей.
В данном случае специализация не нужна ... достаточно перегрузить оператор присвоения, для корректного обмена
(в случае наличия например динамических объектов в структуре)
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++
Помогите исправить ошибки. Надо для шаблонного класса сделать специализацию float #include &lt;iostream&gt; #include &lt;stdlib.h&gt; ...

Явная специализация шаблонов функций - C++
подскажите почему не работает программа? по этой статье все должно работать.. начал изучать шаблоны и понадобилось заполнить...

Явная специализация шаблона класса и ее методы - C++
На 93 строке явная специализация шаблона класса под char. Но я нигде не могу найти, как мне правильно записать методы для него. Если тело...

Явная специализация шаблона для пользовательского типа - C++
Здравствуйте! Сразу извиняюсь если вопрос покажется глупым, перечитал справочник по шаблонам, но так и не нашёл ответ. Есть шаблон класса: ...

Явная специализация, зачем она нужна?(Шаблоны функций) - C++
Какой смысл в явной специализации, когда есть перегрузка? если можно, и примерчик) я себе уже в голову вбил, и тут надо чем-то тяжелым...


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

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

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru