Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 06.12.2012
Сообщений: 9
1

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

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

Author24 — интернет-сервис помощи студентам
Здрасти, Народ.
Подскажите плз в чем преимущество явной специализации перед перед обычным применением перегруженной функции. Привожу код:
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 прошу прощения за коряво поданный вопрос.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.12.2012, 15:38
Ответы с готовыми решениями:

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

Явная специализация
// Выдержка из книги Стивен прата С++ // В следующем примере первый вызов функции Swap()...

Явная специализация шаблона
Здравствуйте. Не совсем разобрася с сабжем. Например, если есть кусочек кода: template &lt;typename...

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

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

Явная специализация шаблонной функции задаёт полный и исчерпывающий список типов, для которых функция будет вести себя не так, как написано в шаблоне. Если вы специализируете шаблонную swap для int, job и bork, то только для этих типы она будет вести себя так, как написано в специализациях, а для остальных — как написано в шаблоне.
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
31.12.2012, 16:07 3
Warbit, я бы сказал так - для единообразия в коде.
Представьте, что у вас в коде есть шаблон и вместо явной его специализации была написана перегруженная функция с таким же именем. Затем по каким-то причинам вам нужно поменять что-то в шаблоне - имя, типы параметров, саму логику внутри. Вы в шаблоне все поменяли, а про перегруженную функцию забыли. Причем компилятор на это ругаться не будет. Соответственно, это может стать причиной ошибок. Поэтому если используете шаблоны - используйте их полноценно.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.12.2012, 22:37 4
Цитата Сообщение от Warbit Посмотреть сообщение
Так вот, ведь я бы мог просто написать явно перегруженную вторую функцию без всяких там шаблонов и специализаций и программа все равно будет рабочей.
В данном случае специализация не нужна ... достаточно перегрузить оператор присвоения, для корректного обмена
(в случае наличия например динамических объектов в структуре)
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
01.01.2013, 12:27 5
Преимущество шаблонов в том, что если текст функции совпадет во всех перегруженных версиях, а различаются только типы данных, с которыми выполняются одни и те же операции, то можно во-первых съэкономить размер текста за счёт одного экземпляра текста функции, а во-вторых застраховаться от ошибок при изменении поведения сразу всех функций: менять то тоже надо один экземпляр и невозможно забыть исправить один экземпляр из десяти. Других преимуществ шаблоны не имеют, они лишь позволяют реализовать единобезобразие ровно один раз и не мучаться, но компилятор создаст те же самые перегруженные версии функции с идентичным текстом и аналогичные друг другу классы.
0
1 / 1 / 0
Регистрация: 06.12.2012
Сообщений: 9
02.01.2013, 18:56  [ТС] 6
меня просто интересует, есть ли такой случай, когда пригодилась бы именно явная специализация, а не явная перегрузка функции. Из учебной литературы я я таких примеров не нашел.
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
02.01.2013, 19:19 7
Почти всё шаблонная магия основывается на частичной специализации, например.

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

Банальный пример "для всего, что можно, но для некоторых по-другому": изменение размеров каких-нибудь векторов. POD-типы можно просто memcpy() скопировать, а все остальные надо копировать/перемещать через соответствующие конструкторы.
0
02.01.2013, 19:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2013, 19:19
Помогаю со студенческими работами здесь

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

Явная специализация шаблона
Добрый день. Подскажите пожалуйста, почему запускается шаблонная функция а не явная специализация?...

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

Явная специализация шаблонов
в 83 строке, когда создаю шаблонную функцию со специализацией для строк, появляется ошибка...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru