Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
#1

Шаблоны. В чем разница между созданием экземпляра и специализацией? - C++

17.09.2015, 06:56. Просмотров 1243. Ответов 44
Метки нет (Все метки)

Протер глаза о Прата, не могу доехать в чем разница между созданием экземпляра и специализацией. Черканите волшебное слово, что бы сразу все понятно стало. )))
http://www.cyberforum.ru/cpp-beginners/thread1278746.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2015, 06:56
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Шаблоны. В чем разница между созданием экземпляра и специализацией? (C++):

Шаблоны. В чем разница?
В чем разница между этими объявлениями? Вроде и так можно и этак. А как...

В чем разница между X x; и X x()?
Корректный ли этот ответ?

В чем разница между [] и * ?
Думал, что ни в чем, но когда попытался сделать так: (в файле 1) char lc; в...

В чем разница между С и С++
Возник вопрос в чем жи разница между С и С++ кроме того, что в С++ есть классы...

В чем разница между new и malloc()?
Всем доброго дня ! Начал читать книгу Пахомов Б. "C/C++ и MS Visual C++ 2008...

44
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,910
Записей в блоге: 3
Завершенные тесты: 1
17.09.2015, 07:51 #2
Специализация позволяет задать другое поведение/содержание.
2
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 08:24 #3
Цитата Сообщение от anti-k Посмотреть сообщение
в чем разница между созданием экземпляра и специализацией
Почитал, действительно, у Праты темновато изложено, перехвалили мы его.
Мне кажется, тут еще и дурацкое слово "экземпляр" все путает. Мне больше нравится слово "инсталляция" шаблона как продукт инстанцирования.
А вы про шаблоны функций или классов? Ну, возьмем для определенности функции.
Шаблон функции задает семейство функций. Специализация задает подсемейство этого семейства, например для типов-указателей. Если это специализация для одного типа, то это подсемейство может состоять из шаблона одной функции.
А экземпляр шаблона функции (в терминах Праты) - это определение функции, сгенерированное компилятором при подстановке вместо параметров шаблона конкретных типов.
Т.е. в скомпилированном коде уже нет шаблонов - только их экземпляры, т.е. определения функций, готовые к работе.

Добавлено через 5 минут
А вообще, если хотите разобраться в шаблонах, то Вандевурда читайте, там все по-человечески описано.
2
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
17.09.2015, 10:56  [ТС] #4
Croessmah, Mr.X, Спасибо!!!

Добавлено через 26 минут
Mr.X, Вы знаете Вандервуд безусловно круто, но пока однозначно не мой уровень. На сколько я понял, не явная специализация происходит все время при вызове функций с различными типами аргументов. А явная(тут я уверен что понял не правильно, просто кастит типы аргументов и возвр.значения(в случае если те обозначены шаблоном ) под необходимый возможный для них тип?????

Добавлено через 13 минут
Croessmah, И еще вот такой тупой вопрос (auto param1, auto param2) {};чем не шаблон???
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 14:00 #5
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Цитата Сообщение от anti-k Посмотреть сообщение
Mr.X, Вы знаете Вандервуд безусловно круто, но пока однозначно не мой уровень. На сколько я понял, не явная специализация происходит все время при вызове функций с различными типами аргументов. А явная(тут я уверен что понял не правильно, просто кастит типы аргументов и возвр.значения(в случае если те обозначены шаблоном ) под необходимый возможный для них тип?????
Ну, из вашего сообщения не очень понятно что вы поняли, и виной тому - терминологическая путаница в книгах и в голове у Праты.
По стандарту и Страуструпу процесс генерации компилятором функций и классов из шаблонов называется инстанцированием шаблона, а сгенерированные функции и классы называются специализациями. Когда нужно различать сгенерированные специализации и написанные программистом явно, то их называют сгенерированными и явными специализациями.
Некоторые программисты и авторы книг различают специализацию шаблона как особый вид шаблона и специализацию в смысле результата инстанцирования, который они называют инсталляцией или экземпляром шаблона.
Поскольку Прата использует термин "экземпляр", то страуструповскую явную специализацию он должен был бы назвать явным экземпляром, а он использует здесь страуструповский термин, чем и путает читателя. В общем его рейтинг упал в моих глазах.

Добавлено через 9 минут
Кстати, у Вандевурда на стр. 34 сказано, что результатом инстанцирования шаблона является экземпляр шаблона, а на стр. 112 - что специализация.
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
17.09.2015, 14:06  [ТС] #6
Уже распогодилось немного )
C++
1
template<> void MySwap(double a, double b);
В примере этой специализации template<> используется просто для перегрузки ф-ции?

Добавлено через 27 секунд
Mr.X, Уже распогодилось немного )

C++
1
template<> void MySwap(double a, double b);
В примере этой специализации template<> используется просто для перегрузки ф-ции?
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 14:13 #7
Цитата Сообщение от anti-k Посмотреть сообщение
В примере этой специализации template<> используется просто для перегрузки ф-ции?
Для указания того, что это экземпляр шаблона MySwap.
0
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
17.09.2015, 14:16  [ТС] #8
Mr.X, то есть где то выше должен быть объявлен сам шаблон?
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 14:17 #9
Цитата Сообщение от anti-k Посмотреть сообщение
то есть где то выше должен быть объявлен сам шаблон?
Ну да.
0
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
17.09.2015, 14:21  [ТС] #10
Mr.X, то есть где то выше был
C++
1
2
template<typename t>
void Swap(T&a,T&b);
а потом
C++
1
template<int> void Swap(double& a, double& b);
и это будет приведение к типу инт?
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 14:24 #11
anti-k, что вы за ерунду написали? Сотрите немедленно!
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
17.09.2015, 16:05  [ТС] #12
Mr.X, ))) С головы же не сотрешь. Вот сейчас читаю мисье Страструпа, но обычно я читаю Прата, понимаю его, решаю задачки, а потом по немножечку одним глазком читаю Бьерна. Сдесь же беда(

Добавлено через 1 час 38 минут
Mr.X, Нашел что надо!!!!! Липман !!! Жизнь налаживается!
0
hoggy
Заблокирован
17.09.2015, 17:09 #13
Цитата Сообщение от Mr.X Посмотреть сообщение
По стандарту и Страуструпу процесс генерации компилятором функций и классов из шаблонов называется инстанцированием шаблона,
верно.

Цитата Сообщение от Mr.X Посмотреть сообщение
а сгенерированные функции и классы называются специализациями.
не верно. они называются "инстансами".

частичная специализация шаблона - тоже шаблон.
полная специализация равносильна инстанцированию
под конкретные типы параметров шаблона.

Цитата Сообщение от anti-k Посмотреть сообщение
template<> void MySwap(double a, double b);
В примере этой специализации template<> используется просто для перегрузки ф-ции?
обозначает "полную специализацию шаблона".

Цитата Сообщение от anti-k Посмотреть сообщение
то есть где то выше должен быть объявлен сам шаблон?
разумеется.
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 19:30 #14
Цитата Сообщение от hoggy Посмотреть сообщение
не верно. они называются "инстансами"
Где они так называются?
Я русскую терминологию имел в виду.
В русском переводе Страуструпа и других книг, в которых не различается специализация и экземпляр они называются именно специализациями.

Добавлено через 3 минуты
Цитата Сообщение от anti-k Посмотреть сообщение
Нашел что надо!!!!! Липман !!! Жизнь налаживается!
Почитал за 2014 год. Очень профессиональное изложение, с Пратой не сравнить. Я однозначно за Липпмана!
1
hoggy
Заблокирован
17.09.2015, 20:03 #15
Цитата Сообщение от Mr.X Посмотреть сообщение
Где они так называются?
Джосатис, Александресску.
Цитата Сообщение от Mr.X Посмотреть сообщение
в которых не различается специализация и экземпляр
странно. почему то я не припоминаю ни одной книжки,
где бы их не различали.
более того: их нельзя не различать.
потому что различие имеет принципиальное значение:

Специализированный шаблон — это новый шаблон

Если внимательно читать ISO стандарт С++, то можно обнаружить интересное утверждение: создав специализированный шаблонный класс мы создаем новый шаблонный класс (14.5.4.3). Что это нам дает? Специализированный шаблонный класс может содержать методы, поля или объявления типов которых нет в шаблонном классе который мы специализируем.
(с) отрывочек из статьи.
инстанс - продукт шаблона.
то есть, это уже не шаблон, а класс,
который сгенерировал компилятор по шаблону.

а вот специализация - это шаблон,
на основе которого компилятору ещё только предстоит инстанцировать инстанс.

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

я прочитал множество книг самых разных авторов.
но что-то я не припоминаю ни одного случая,
когда авторы (ну или переводчики) путали бы
понятие "инстанс шаблона" с "специализацией шаблона".

Добавлено через 12 минут
кстати, глянул стандарт.
там инстансы шаблонов так же называются "инстансами".

вот например:

3.7.4.2 Deallocation functions

Each deallocation function shall return void and its first parameter shall be void*. A deallocation function
can have more than one parameter. The global operator delete with exactly one parameter is a usual (nonplacement)
deallocation function. The global operator delete with exactly two parameters, the second
of which has type std::size_t, is a usual deallocation function. Similarly, the global operator delete[]
with exactly one parameter is a usual deallocation function. The global operator delete[] with exactly
two parameters, the second of which has type std::size_t, is a usual deallocation function.37 If a class T
has a member deallocation function named operator delete with exactly one parameter, then that function
is a usual deallocation function. If class T does not declare such an operator delete but does declare a
member deallocation function named operator delete with exactly two parameters, the second of which has
type std::size_t, then this function is a usual deallocation function. Similarly, if a class T has a member
deallocation function named operator delete[] with exactly one parameter, then that function is a usual
(non-placement) deallocation function. If class T does not declare such an operator delete[] but does
declare a member deallocation function named operator delete[] with exactly two parameters, the second
of which has type std::size_t, then this function is a usual deallocation function. A deallocation function
can be an instance of a function template. Neither the first parameter nor the return type shall depend on
a template parameter. [ Note: That is, a deallocation function template shall have a first parameter of type
void* and a return type of void (as specified above). — end note ] A deallocation function template shall
have two or more function parameters. A template instance is never a usual deallocation function, regardless
of its signature.
ну и там во многих других местах так же присутствуют упоминания об инстансах шаблона.

а вот специализацию шаблона стандарт так и называет :
специализацией шаблона.
подразумевая при этом именно специализацию шаблона,
а не продукты инстанцирования.
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 20:22 #16
Цитата Сообщение от hoggy Посмотреть сообщение
странно. почему то я не припоминаю ни одной книжки,
где бы их не различали
Честно говоря, сам только сегодня о такой путанице узнал, да еще у старика Страуструпа.
Вот цитата из его четвертого издания:
<
26.2 Template Instantiation
Given a template definition and a use of that template, it is the implementation’s job to generate correct code. From a class template and a set of template arguments, the compiler needs to generate the definition of a class and the definitions of those of its member functions that were used in the program (and only those; §26.2.1). From a template function and a set of template arguments, a function needs to be generated. This process is commonly called template instantiation.
The generated classes and functions are called specializations. When we need to distinguish between generated specializations and specializations explicitly written by the programmer (§25.3), we refer to generated specializations and explicit specializations, respectively. An explicit specialization is often referred to as a user-defined specialization, or simply a user specialization.
>
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7002 / 3295 / 448
Регистрация: 04.12.2011
Сообщений: 9,115
Записей в блоге: 5
17.09.2015, 20:59 #17
Цитата Сообщение от Mr.X Посмотреть сообщение
Честно говоря, сам только сегодня о такой путанице узнал, да еще у старика Страуструпа.
Где же путаница? Инстанционирование и специализация это одно и то же. Кроме случая явной специализации. Например шаблон вызывает оператор сложения для пары объектов <T>. Естественно компилятор сгенерирует разный код для int и double, но для типа string сложение даже семантически (логически) это нечто другое, поэтому и требуется вручную, явно определить поведение для этого типа если (не дай бог конечно)) мыслится наряду с числовыми типами в такой шаблон и string передать. Ну то есть, по сути тут всё правильно, только все сказали разными словами.
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 21:04 #18
IGPIGP, это вы уже по кругу пошли. Я же писал выше:
Цитата Сообщение от Mr.X Посмотреть сообщение
По стандарту и Страуструпу процесс генерации компилятором функций и классов из шаблонов называется инстанцированием шаблона, а сгенерированные функции и классы называются специализациями. Когда нужно различать сгенерированные специализации и написанные программистом явно, то их называют сгенерированными и явными специализациями.
Некоторые программисты и авторы книг различают специализацию шаблона как особый вид шаблона и специализацию в смысле результата инстанцирования, который они называют инсталляцией или экземпляром шаблона.
0
hoggy
Заблокирован
17.09.2015, 21:15 #19
Цитата Сообщение от IGPIGP Посмотреть сообщение
Где же путаница? Инстанционирование и специализация это одно и то же. Кроме случая явной специализации.
ну например, вот в этом вашем предложении.
потому что инстанцирование и специализация - не одно и тоже.

http://rextester.com/WYWSD60564

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
 
// --- базовый шаблон
template<typename T>
struct Property
{
    Property() { std::cout<<"version for data\n"; }
};
 
// --- специализация шаблона для случая, когда T имеет тип функции    
template<typename R, typename... Args>
struct Property<R(Args...)> 
{
    Property() { std::cout<<"version for function\n"; }
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    // --- инстанс базового шаблона
    Property<int> 
        prop1;
    
    
    // --- инстанс специализированного шаблона
    Property<int()> 
        prop2;
}
на практике нам фиолетово,
инстанс какой именно версии случается:
базового шаблона, либо каких то его специализаций.

для нас это просто инстанс шаблона Property.


если же вы ставите знак равенства между "специализацией шаблона" и "инстансом шаблона",
тогда объясните мне, чем является шаблон:
C++
1
2
template<typename R, typename... Args>
struct Property<R(Args...)> { ... };
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7002 / 3295 / 448
Регистрация: 04.12.2011
Сообщений: 9,115
Записей в блоге: 5
17.09.2015, 21:16 #20
Цитата Сообщение от Mr.X Посмотреть сообщение
это вы уже по кругу пошли
Эт я люблю.
Но по сути последней фразой я намекнул, что круговое движение присутствует, а я присоединился просто.
Явная специализация это сценарий запрещающий компилятору специализировать по общему шаблону и предписывающая свою логику. А инстанс это уже сущность времени выполнения. Но эта сущность - конкретный тип, а не экземпляр типа.
0
17.09.2015, 21:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2015, 21:16
Привет! Вот еще темы с решениями:

В чем разница между malloc и new?
в чем разница? что лучше использовать?

В чем разница между Double и Float?
Хмм? :(

В чем разница между random и randomize?
в чем разница между random и randomize??

В чем разница между Debug and Release?
Какие действия выполняет debug в Visual studio и какие Release, в чем разница?...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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