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

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

17.09.2015, 06:56. Показов 5672. Ответов 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
9007 / 4708 / 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
9007 / 4708 / 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
9007 / 4708 / 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
9007 / 4708 / 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
9007 / 4708 / 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
9007 / 4708 / 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
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru