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

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

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

Студворк — интернет-сервис помощи студентам
Протер глаза о Прата, не могу доехать в чем разница между созданием экземпляра и специализацией. Черканите волшебное слово, что бы сразу все понятно стало. )))
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.09.2015, 06:56
Ответы с готовыми решениями:

В чем разница между явной специализацией и инстанциацией?
В чем разница между явной специализацией и инстанциацией? Желательно, подробно.

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

В чем разница при создании экземпляра?
Работа с интерфейсами понятна, но видел в разных примерах разные варианты создания экземпляра класса, который реализует интерфейс,...

44
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
17.09.2015, 07:51
Специализация позволяет задать другое поведение/содержание.
2
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 08:24
Цитата Сообщение от anti-k Посмотреть сообщение
в чем разница между созданием экземпляра и специализацией
Почитал, действительно, у Праты темновато изложено, перехвалили мы его.
Мне кажется, тут еще и дурацкое слово "экземпляр" все путает. Мне больше нравится слово "инсталляция" шаблона как продукт инстанцирования.
А вы про шаблоны функций или классов? Ну, возьмем для определенности функции.
Шаблон функции задает семейство функций. Специализация задает подсемейство этого семейства, например для типов-указателей. Если это специализация для одного типа, то это подсемейство может состоять из шаблона одной функции.
А экземпляр шаблона функции (в терминах Праты) - это определение функции, сгенерированное компилятором при подстановке вместо параметров шаблона конкретных типов.
Т.е. в скомпилированном коде уже нет шаблонов - только их экземпляры, т.е. определения функций, готовые к работе.

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

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

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

Решение

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

Добавлено через 9 минут
Кстати, у Вандевурда на стр. 34 сказано, что результатом инстанцирования шаблона является экземпляр шаблона, а на стр. 112 - что специализация.
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
17.09.2015, 14:06  [ТС]
Уже распогодилось немного )
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
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 14:13
Цитата Сообщение от anti-k Посмотреть сообщение
В примере этой специализации template<> используется просто для перегрузки ф-ции?
Для указания того, что это экземпляр шаблона MySwap.
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
17.09.2015, 14:16  [ТС]
Mr.X, то есть где то выше должен быть объявлен сам шаблон?
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 14:17
Цитата Сообщение от anti-k Посмотреть сообщение
то есть где то выше должен быть объявлен сам шаблон?
Ну да.
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
17.09.2015, 14:21  [ТС]
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
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 14:24
anti-k, что вы за ерунду написали? Сотрите немедленно!
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
17.09.2015, 16:05  [ТС]
Mr.X, ))) С головы же не сотрешь. Вот сейчас читаю мисье Страструпа, но обычно я читаю Прата, понимаю его, решаю задачки, а потом по немножечку одним глазком читаю Бьерна. Сдесь же беда(

Добавлено через 1 час 38 минут
Mr.X, Нашел что надо!!!!! Липман !!! Жизнь налаживается!
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.09.2015, 17:09
Цитата Сообщение от Mr.X Посмотреть сообщение
По стандарту и Страуструпу процесс генерации компилятором функций и классов из шаблонов называется инстанцированием шаблона,
верно.

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

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

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

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

Добавлено через 3 минуты
Цитата Сообщение от anti-k Посмотреть сообщение
Нашел что надо!!!!! Липман !!! Жизнь налаживается!
Почитал за 2014 год. Очень профессиональное изложение, с Пратой не сравнить. Я однозначно за Липпмана!
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.09.2015, 20:03
Цитата Сообщение от 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
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 20:22
Цитата Сообщение от 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
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.09.2015, 20:59
Цитата Сообщение от Mr.X Посмотреть сообщение
Честно говоря, сам только сегодня о такой путанице узнал, да еще у старика Страуструпа.
Где же путаница? Инстанционирование и специализация это одно и то же. Кроме случая явной специализации. Например шаблон вызывает оператор сложения для пары объектов <T>. Естественно компилятор сгенерирует разный код для int и double, но для типа string сложение даже семантически (логически) это нечто другое, поэтому и требуется вручную, явно определить поведение для этого типа если (не дай бог конечно)) мыслится наряду с числовыми типами в такой шаблон и string передать. Ну то есть, по сути тут всё правильно, только все сказали разными словами.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 21:04
IGPIGP, это вы уже по кругу пошли. Я же писал выше:
Цитата Сообщение от Mr.X Посмотреть сообщение
По стандарту и Страуструпу процесс генерации компилятором функций и классов из шаблонов называется инстанцированием шаблона, а сгенерированные функции и классы называются специализациями. Когда нужно различать сгенерированные специализации и написанные программистом явно, то их называют сгенерированными и явными специализациями.
Некоторые программисты и авторы книг различают специализацию шаблона как особый вид шаблона и специализацию в смысле результата инстанцирования, который они называют инсталляцией или экземпляром шаблона.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.09.2015, 21:15
Цитата Сообщение от 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
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.09.2015, 21:16
Цитата Сообщение от Mr.X Посмотреть сообщение
это вы уже по кругу пошли
Эт я люблю.
Но по сути последней фразой я намекнул, что круговое движение присутствует, а я присоединился просто.
Явная специализация это сценарий запрещающий компилятору специализировать по общему шаблону и предписывающая свою логику. А инстанс это уже сущность времени выполнения. Но эта сущность - конкретный тип, а не экземпляр типа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.09.2015, 21:16
Помогаю со студенческими работами здесь

Шаблоны. В чем разница?
В чем разница между этими объявлениями? Вроде и так можно и этак. А как правильней? template &lt;class T&gt; struct list { T...

В чем разница, если мы пишем имя класса перед инициализацией экземпляра?
А в чем разница в записи FbTransaction fbt = fg.BeginTransaction(); и такой записи fbt = fg.BeginTransaction(); ?

Разница между копированием exe файла в адресное пространство и созданием образа
Не понимаю. &quot;Вместо выделения какого-то пространства из страничного файла система использует истинное содержимое, или образ exe файла как...

В чем разница настроек доступа к данным и Шаблоны ограничений?
В настройке Прав доступа в Роли имеются две закладки, одна называется Права - Ограничения доступа к данным , вторая Шаблоны ограничений....

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru