Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

Что такое шаблоны в C++? - C++

08.05.2013, 07:49. Просмотров 3388. Ответов 49
Метки нет (Все метки)

Что такое шаблоны и для чего они нужны? Если не трудно приведите показательный пример применения шаблона.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2013, 07:49     Что такое шаблоны в C++?
Посмотрите здесь:
Что такое шаблоны функций? C++
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами? C++
C++ Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
C++ Что такое хэндлер файла? Что такое файловый указатель?
Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них C++
Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере C++
Что такое перегрузка оператора? Что у меня в коде за ошибка? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.05.2013, 15:40     Что такое шаблоны в C++? #41
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Из-за этого определения внутри List<T> ограничены исключительно подстановками конкретного типа вместо T и никакой специализации... быть не может
Без специализации вообще нет конкретного типа данных, а переменную нельзя создать вместо конкретного типа от ничего. И от самого шаблона нельзя. Попробуй вместо
C++
1
TArray <TStaffList>         StaffLists;
написать
C++
1
TArray StaffLists;
и убедись. Просто здесь конкретный тип массива не декларирован как отдельная явная сущность.

Добавлено через 2 минуты
Точно также, как и в
Pascal
1
2
type ta=array[1..n] of real;
var x:ta;
и в
Pascal
1
var x:array[1..n] of real;
одинаково описан тип массива, но в
Pascal
1
var x:array[1..n] of real;
он безымянный и описан прямо в декларации переменной, а в
Pascal
1
2
type ta=array[1..n] of real;
var x:ta;
тип массива имеет имя, использованное в декларации переменной в готовом виде без повторного описания.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 15:55     Что такое шаблоны в C++? #42
taras atavin, вы явно путаете специализацию с инстанцированием шаблона.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.05.2013, 16:10     Что такое шаблоны в C++? #43
Цитата Сообщение от taras atavin Посмотреть сообщение
специализация:
C++
1
TArray <TStaffList>  StaffLists;
C++
1
2
TArray <TStaffList>  StaffLists; //специализация 
TArray <TStaffList>  StaffLists_2; //и это специализация по вашей логике
как же это оно у нас компилируется и линкуется без redefinition?
Когда компилятор первый раз встречает TArray <TStaffList> то он ищет специализацию, если таковой нет - то да, он(компилятор) неяно её создает, если же специализация есть то компилятор делает инстанцирование.
Потому в общем случае нельзя говорить что это
C++
1
TArray <TStaffList>  StaffLists;
специализация, это инстанцирование
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 16:21     Что такое шаблоны в C++? #44
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Jupiter Посмотреть сообщение
то да, он(компилятор) неяно её создает
Все-таки он создает код "по шаблону", тогда как специализация предполагает альтернативную реализацию для конкретного типа
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.05.2013, 10:22     Что такое шаблоны в C++? #45
Цитата Сообщение от Croessmah Посмотреть сообщение
taras atavin, вы явно путаете специализацию с инстанцированием шаблона.
Нельзя инстацировать сам шаблон, так же как нельзя инстанцировать и абстрактный класс. Инстацирование - это создание экземпляра класса, а шаблон - это только некие правила создания класса, но не сам класс. Инстацировать можно только конкретный класс, а в случае шаблона получить его можно только путём специализации. Так что это ты путаешь шаблон с макросом. Специализация шаблона выполняет подстановку фактического параметра и при использовании макроса выполняется подстановка. Но этим сходство и ограничивается. При использовании макроса подстановка и контроль типов разделены, подстановка выполняется препроцессором, а контроль типов компилятором, а при специализации подстановка не отделена от контроля типов.

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
как же это оно у нас компилируется и линкуется без redefinition?
тип то безымянный.

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
специализация предполагает альтернативную реализацию для конкретного типа
конкретную на основе шаблона.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.05.2013, 10:44     Что такое шаблоны в C++? #46
Инстанцирование шаблона - генерация кода по шаблону для конкретных параметров.
Специализация шаблона - особое правило инстанцирования шаблона для типа, указанного в специализации.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.05.2013, 10:53     Что такое шаблоны в C++? #47
Все правила в самом шаблоне, для того он и предназначен.

Добавлено через 56 секунд
А специализация конкретизирует шаблон.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
12.05.2013, 10:54     Что такое шаблоны в C++? #48
Цитата Сообщение от taras atavin Посмотреть сообщение
Все правила в самом шаблоне, для того он и предназначен.
Но иногда нужно исключение из правил - специализацию
Убежденный
Системный программист
Эксперт С++
15249 / 6881 / 1092
Регистрация: 02.05.2013
Сообщений: 11,268
Завершенные тесты: 1
12.05.2013, 11:04     Что такое шаблоны в C++? #49
Цитата Сообщение от taras atavin Посмотреть сообщение
Нельзя инстацировать сам шаблон, так же как нельзя инстанцировать и абстрактный класс. Инстацирование - это создание экземпляра класса, а шаблон - это только некие правила создания класса, но не сам класс. Инстацировать можно только конкретный класс, а в случае шаблона получить его можно только путём специализации. Так что это ты путаешь шаблон с макросом. Специализация шаблона выполняет подстановку фактического параметра и при использовании макроса выполняется подстановка.
Давайте обратимся к Стандарту (2003):
14.7 Template instantiation and specialization

1. The act of instantiating a function, a class, a member of a class template or a
member template is referred to as template instantiation.
Инстанцирование шаблона - это создание функции/класса/члена, а не объекта.
Хотя инстанцирование может идти бок о бок с созданием объекта.
Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <typename T_Type>
class foo
{
};
 
void some_func(foo<bool> const &Foo); // Инстанцирование шаблона.
 
foo<int> Foo; // Инстанцирование шаблона и создание объекта. 
 
// А это специализация:
 
template <>
class foo<char>
{
public:
    enum {is_char = 1};
};
В той же главе сказано:
14.7

4. ...
A specialization is a class, function, or class member that is either
instantiated or explicitly specialized (14.7.3).
Согласно этому определению, инстанцированный шаблон является специализацией.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2013, 14:18     Что такое шаблоны в C++?
Еще ссылки по теме:
В этой части кода происходит объявление функций? Что такое void? Что в скобках? C++
C++ Шаблоны. Что я не так делаю?
C++ Что такое #, include, что это означает
Шаблоны без параметров, что это? C++
Что за пустые шаблоны template <> struct/inline? C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
12.05.2013, 14:18     Что такое шаблоны в C++? #50
Убежденный, Ок, согласен. Однако дело в том, что говоря о специализации мы здесь говорили о explicit/partial specialization ( в чем несомненно есть наша ошибка ), тогда как Тарас доказывал, что специализация существует только используя инстанцирование (причем только неявное).

taras atavin,

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
// primary template
template<class T, class F>
class S {};
 
// explicit specialization
template<>
class S<int, int> {};
 
// partial specialization
template<class T>
class S<T, int> {};
 
// explicit instantiation
template class S<float, float>;
 
int main()
{
   // implicit instantiation (create specialization for S<double, double>).
   S<double, double> s;
   // no implicit instantiation (there is explicit specialization).
   S<int, int> si; 
   // no implicit instantiation (there is explicit instantiation).
   S<float, float> sf;
   // implicit instantion of S<T, int> (create specialization S<float, int> for part spec S<T, int>).
   S<float, int> sif;
}
Yandex
Объявления
12.05.2013, 14:18     Что такое шаблоны в C++?
Ответ Создать тему
Опции темы

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