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

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

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

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

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

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

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

44
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.09.2015, 21:19
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от IGPIGP Посмотреть сообщение
Кроме случая явной специализации.
нет такого.
есть "полная специализация",
и вот она как раз таки описывает инстанс шаблона.


и "частичная специализация",
которая сама по себе является ещё одним шаблоном.

Добавлено через 2 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
А инстанс это уже сущность времени выполнения. Но эта сущность - конкретный тип, а не экземпляр типа
вы противоречите себе самому.

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

потому что с++ - статический.
все его типы - это сущности времени компиляции,
а не выполнения.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.09.2015, 21:26
Цитата Сообщение от hoggy Посмотреть сообщение
тогда объясните мне, чем является шаблон:
специализацией для функции, я думаю. У меня не достаточно опыта спорить о таком сложном вопросе как шаблоны C++. Из своей практики я знаю, что при попытки инстанцирования шаблона на типе который не поддерживает заявленной логики - авария. Потому-то в частности и применяют явную специализацию. Разве нет?

Добавлено через 4 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
вы противоречите себе самому.
Да, о времени выполнения, это не ко времени. Согласен. Но это отдельная фраза никак не меняет основного смысла. Я пока убеждён что инстанцирование и специализация это одно и тоже. Явная специализация это подмножество.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.09.2015, 21:27
Цитата Сообщение от IGPIGP Посмотреть сообщение
специализацией для функции, я думаю.
так вы определитесь: специализация - шаблон, или это это инстанс шаблона?
потому что сейчас вы назвали специализацией шаблон.
а чуть выше писали, что это - инстанс шаблона.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Инстанционирование и специализация это одно и то же.
вам не кажется, что вы уже запутались?

Цитата Сообщение от IGPIGP Посмотреть сообщение
применяют явную специализацию. Разве нет?
применяют либо частичную, либо полную специализацию.
но нет такого термина "явная специализация".
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.09.2015, 21:37
Цитата Сообщение от hoggy Посмотреть сообщение
так вы определитесь: специализация - шаблон, или это это инстанс шаблона?
Я не писал, но по сути специализация может не задавать, например все типы явно. То есть если их несколько, то могут быть явно указаны только один или несколько и т.п. То есть часть работы может быть оставлена компилятору. Я кажется понял, что Вы имеете ввиду. То есть инстанс это, грубо говоря, готовый скомпилированный код и в случае частичной специализации он не равен своему типу - специализированному шаблону?
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 21:42
Цитата Сообщение от hoggy Посмотреть сообщение
если же вы ставите знак равенства между "специализацией шаблона" и "инстансом шаблона"
Ну дак это Страуструп ставит знак равенства.
Цитата Сообщение от hoggy Посмотреть сообщение
Цитата Сообщение от IGPIGP Посмотреть сообщение
Кроме случая явной специализации.
нет такого.
есть "полная специализация",
и вот она как раз таки описывает инстанс шаблона.
Вы тоже уже запутались. Кому я приводил цитату выше:
Цитата Сообщение от Mr.X Посмотреть сообщение
An explicit specialization is often referred to as a user-defined specialization, or simply a user specialization.
Добавлено через 3 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
и вот она как раз таки описывает инстанс шаблона
А так-то да, явная специализация - это не перегрузка шаблона, а экземпляр, он же специализация, он же инсталляция, он же инстанс.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.09.2015, 21:56
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть инстанс это, грубо говоря, готовый скомпилированный код
инстанс - продукт инстанцирования шаблона.

грубо говоря, это - класс, сгенерированный компилятором по шаблону.
инстанцирование происходит в момент,
когда известны параметры шаблона:

C++
1
2
3
4
5
6
7
8
int main()
{
    // --- здесь компилятор, что бы создать объект класса
    // должен сначала сгенерировать этот самый класс
    // по шаблону 'Property'
    Property<int> 
        prop1;
}
если бы программист не написал код использования шаблона,
то он бы никогда не был бы инстанцированн.

это свойство используется в мета-программировании.

например:
http://rextester.com/EVMZ71313

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
 
template<class T> struct example
{
    // инстанцируется только тот конструктор
    // который был задействован
    
    template<class F>
        example(F f)
    {
        f();
    }
    
    template<class F, class A>
    example(F f, A a)
    {
        f(a);
    }
};
 
 
// --- функция без аргументов
// поэтому второй конструктор шаблона для неё в принципе не подходит
void foo() { std::cout<<"launch foo\n"; }
 
int main()
{
 
    std::cout << "Hello, world!\n";
 
    
    // но поскольку мы задейстсвовали именно первый конструктор
    // и не использовали второй конструктор
    example< void(*)() >
        ex(foo);
    
    // то второй конструктор оказался не инстанцированным
    // то бишь, в инстанс example< void(*)() >
    // попал только один конструктор
    
    // поэтому, нет никаких ошибок компиляции
    
    // а вот если расскоментировать эту строчку
    //example< void(*)() > ex2(foo, 10);
    
    // тогда в инстанс шаблона попадут оба конструктора
    // и код не скомпилируется
    // ведь функцию foo нельзя вызвать с аргументом
}
важно понимать, что "инстанс" - это класс,
который сгенерировал компилятор по шаблону в результате его инстанцирования.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 22:07
Цитата Сообщение от Mr.X Посмотреть сообщение
о такой путанице
Цитата Сообщение от IGPIGP Посмотреть сообщение
Где же путаница?
Цитата Сообщение от hoggy Посмотреть сообщение
Цитата Сообщение от IGPIGP Посмотреть сообщение
Где же путаница? Инстанционирование и специализация это одно и то же. Кроме случая явной специализации.
ну например, вот в этом вашем предложении.
потому что инстанцирование и специализация - не одно и тоже.
Цитата Сообщение от hoggy Посмотреть сообщение
вам не кажется, что вы уже запутались?
Цитата Сообщение от Mr.X Посмотреть сообщение
Вы тоже уже запутались.
Ну вот, а кто-то легкомысленно сомневался, в существовании путаницы!
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.09.2015, 22:22
Цитата Сообщение от hoggy Посмотреть сообщение
важно понимать, что "инстанс" - это класс,
который сгенерировал компилятор по шаблону в результате его инстанцирования.
Это вроде понято и было. Понятно, что инстанцирование, это часть генерации компилятором конкретного типа. И понятно, что при инстанцировании компилятор специализирует шаблон до конкретного типа. Я не понимал, что в случае частичной специализации (программистом) происходит только сужение области определения шаблона, то есть порождается суженный шаблон, который будет так или иначе инстанцирован в коде. Спасибо, это действительно интересно.

Добавлено через 9 минут
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну вот, а кто-то легкомысленно сомневался, в существовании путаницы
Некоторая размытость конечно была. Можно бы сказать, что инстанцирование подразумевают полную специализацию. Но специализация может быть и частичной. Так и хочется сказать что-то вроде частичного инстанцирования, но это уже не будет хорошо.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.09.2015, 22:33
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну дак это Страуструп ставит знак равенства.
если я правильно его понял,
то он ставит знак равенства между "инстансом" и "полной специализацией".

потому что "полная специализация" описывает именно инстанс,
и не является шаблоном.



например:
C++
1
2
template<T> void foo() 
{ std::cout<<typeid(T).name()<<std::endl; }
можно использовать в хэдэрах,
и не будет никаких ошибок связанных с множественным определением.

но обычную функцию:
C++
1
2
void foo() 
{ std::cout<<typeid(int).name()<<std::endl; }
определять в хэдэре нельзя, без риска нарваться на ошибку ODR

а теперь делаем фокус:
C++
1
2
3
4
5
template<T> void foo() 
{ std::cout<<typeid(T).name()<<std::endl; }
 
template<> void foo<int>() 
{ std::cout<<typeid(int).name()<<std::endl; }
для полной специализации получаем ошибку ODR
так же, как и для обычной нешаблонной функции.

отсюда делаем вывод:
полная специализация не является шаблоном
и описывает инстанс.

касательно Страуструпа, я думаю, что он имел ввиду,
что при инстанцировании компилятор по шаблону выстраивает полную специализацию под конкретные параметры.
и таким образом, получает описание нужного инстанса.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
17.09.2015, 22:49
Цитата Сообщение от hoggy Посмотреть сообщение
если я правильно его понял,
то он ставит знак равенства между "инстансом" и "полной специализацией".
Мда... Не буду ничего говорить о путанице! В вышеприведенной цитате он определяет сущность, называемую вами инстансом, словом "специализация" (без всяких эпитетов!).
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.09.2015, 14:24
Цитата Сообщение от Mr.X Посмотреть сообщение
В вышеприведенной цитате он определяет сущность, называемую вами инстансом, словом "специализация" (без всяких эпитетов!).
И правда. Специализация, согласно цитате, это результат. Результат инстанцирования, читай, - инстанс! То есть не о какой частичной специализации в такой трактовке и речи быть не может. А вот явная специализация как термин присутствует. Так что зря я сложил оружие.

Не по теме:

Мне иногда всерьёз кажется, что что-то из того, что порой приходит в голову, это и не я придумал. У Вас так бывает? :)

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 14:27
Цитата Сообщение от IGPIGP Посмотреть сообщение
А вот явная специализация как термин присутствует
термина "явная специализация" не существует.
термина "специализация" так же не существует.
существуют термины:
"частичная специализация",
и "полная специализация".
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
19.09.2015, 16:08
Цитата Сообщение от hoggy Посмотреть сообщение
термина "явная специализация" не существует.
На cppreference считают иначе, хотя в Стандарт я не заглядывал.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.09.2015, 16:21
Цитата Сообщение от hoggy Посмотреть сообщение
термина "явная специализация" не существует
В том что Вы говорите есть смысл. Но:
С нами крестная (плюсовая) сила и Бьерн Страуструп.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 16:22
Цитата Сообщение от gromo Посмотреть сообщение
На cppreference считают иначе
судя по всему, они ставят знак равенства между "явной" и "полной":
explicit (full) template specialization

Syntax
template <> declaration
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.09.2015, 16:28
Цитата Сообщение от hoggy Посмотреть сообщение
судя по всему, они ставят знак равенства между "явной" и "полной":
Вряд ли. Специализация которую проводит компилятор для выведения конкретного класса (инстанса) по Б. Страуструпу, это самая полная специализация. Программист может написать явную в виде частичной или полной. Так, мне кажется, логично разграничить эти термины, что бы они не подрались.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 16:46
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вряд ли.
вы вообще по ссылке cppreference смотрели?

они специально для вас привели этот синопсис:
Syntax
template <> declaration
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.09.2015, 17:25
Цитата Сообщение от hoggy Посмотреть сообщение
термина "явная специализация" не существует.
термина "специализация" так же не существует.
Т.е. то, что оба они присутствуют в вышеприведенной цитате из учебника Страуструпа вас не убеждает?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 17:31
Цитата Сообщение от Mr.X Посмотреть сообщение
Т.е. то, что оба они присутствуют в вышеприведенной цитате из учебника Страуструпа вас не убеждает?
ничуть.

специализаций в сферичесом вакууме не существует.
полная специализация, которую имел ввиду Страуструп,
так и называется "полной специализацией".
а ничего другого он иметь ввиду не мог.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.09.2015, 17:49
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вряд ли. Специализация, которую проводит компилятор для выведения конкретного класса (инстанса) по Б. Страуструпу, это самая полная специализация. Программист может написать явную в виде частичной или полной. Так, мне кажется, логично разграничить эти термины, что бы они не подрались.
А, вот, вычитал у Страуструпа. Инсталляцию (экземпляр) шаблона он называет специализацией (просто, без всяких эпитетов), а специализацию как альтернативное определение (версию) шаблона он называет пользовательской специализацией. Т.е. в разных учебниках довольно разная терминология получается.
Собственно, тут слово специализация применяется к двум совершенно разным сущностям, это я и имел в виду, говоря о путанице.
Специализации в смысле экземпляры могут быть сгенерированными компилятором и явными, т.е. написанными программистом, а пользовательские специализации, т.е. версии шаблона, могут быть полными или частичными.

Добавлено через 2 минуты
IGPIGP, т.е. вы опять запутались!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.09.2015, 17:49
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
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