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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.05.2013, 07:49     Что такое шаблоны в C++? #1
Что такое шаблоны и для чего они нужны? Если не трудно приведите показательный пример применения шаблона.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
08.05.2013, 07:58     Что такое шаблоны в C++? #2
Цитата Сообщение от programina Посмотреть сообщение
Если не трудно приведите показательный пример применения шаблона.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
 
template<typename T>
T summ(const T & x1,const T & x2){
    return x1+x2;
}
 
 
 
int main(){
    int a=12;
    int b=34;
    std::cout<<summ(a,b)<<std::endl;
    double c=12.5;
    double d=32.12;
    std::cout<<summ(c,d)<<std::endl;
}
Добавлено через 35 секунд
Википедия: Шаблоны C++
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.05.2013, 08:07  [ТС]     Что такое шаблоны в C++? #3
Croessmah, то есть компилятор сам определяет тип данных во время компиляции?
Или тип определяется во время исполнения программы?
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
08.05.2013, 08:59     Что такое шаблоны в C++? #4
programina, на этапе компиляции.
okman
 Аватар для okman
15 / 21 / 1
Регистрация: 05.04.2013
Сообщений: 203
08.05.2013, 09:01     Что такое шаблоны в C++? #5
Цитата Сообщение от programina Посмотреть сообщение
Croessmah, то есть компилятор сам определяет тип данных во время компиляции?
Или тип определяется во время исполнения программы?
Ну он же сам указал тип данных)
-=ЮрА=-
08.05.2013, 09:04
  #6

Не по теме:

programina, по ссылке небольшой утилитарный аспект использования шаблонов Безопасный ввод через функцию-шаблон

programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.05.2013, 09:06  [ТС]     Что такое шаблоны в C++? #7
[off]
Цитата Сообщение от Croessmah Посмотреть сообщение
опера мини коряво форматирует страницу

Добавлено через 1 минуту
-=ЮрА=-, спасибо
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
08.05.2013, 09:32     Что такое шаблоны в C++? #8
Цитата Сообщение от programina Посмотреть сообщение
Что такое шаблоны и для чего они нужны? Если не трудно приведите показательный пример применения шаблона.
На плюсах существует две категории шаблонов: шаблоны классов и шаблоны функций. Шаблон функции есть однократно функция, выполняющая операции одной семантики с данными разных типов и описанная ровно один раз для всех типов своих параметров, она имеет один исходный текст своего тела для всех типов данных, к которым применима, а за различие внутренней реализации операций отвечает перегрузка используемых в ней операторов и вызываемых ею других функций, перегрузка самой функции выполняется автоматически. Шаблон же класса есть сокращённая запись нескольких классов, различающихся типами фактических членов и/или определёнными в этих классах константами, но не исходным текстом.

Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
template<typename T>
void swap(T &a, T &b)
{
 T t;
 t=a;
 a=b;
 b=t;
}
заменяет
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
void swap(int &a, int &b)
{
 int t;
 t=a;
 a=b;
 b=t;
}
void swap(char &a, char &b)
{
 char t;
 t=a;
 a=b;
 b=t;
}
void swap(float &a, float &b)
{
 float t;
 t=a;
 a=b;
 b=t;
}
void swap(double &a, double &b)
{
 double t;
 t=a;
 a=b;
 b=t;
}
void swap(signed &a, signed &b)
{
 signed t;
 t=a;
 a=b;
 b=t;
}
void swap(unsigned &a, unsigned &b)
{
 unsigned t;
 t=a;
 a=b;
 b=t;
}
void swap(short &a, short &b)
{
 short t;
 t=a;
 a=b;
 b=t;
}
void swap(long &a, long &b)
{
 long t;
 t=a;
 a=b;
 b=t;
}
 
void swap(signed short &a, signed short &b)
{
 signed t;
 t=a;
 a=b;
 b=t;
}
void swap(unsigned short &a, unsigned short &b)
{
 unsigned short t;
 t=a;
 a=b;
 b=t;
}
void swap(signed long &a, signed long &b)
{
 signed long t;
 t=a;
 a=b;
 b=t;
}
void swap(unsigned long &a, unsigned long &b)
{
 unsigned long t;
 t=a;
 a=b;
 b=t;
}...
и так для всех существующих в проекте типов, включая структуры и классы. Одна единственная функция swap будет менять местами операнды всех типов и иметь соответствующие перегруженные версии, если её описать в виде шаблона функции.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.05.2013, 09:40  [ТС]     Что такое шаблоны в C++? #9
taras atavin, спасибо, достаточно наглядный пример.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.05.2013, 09:42     Что такое шаблоны в C++? #10
taras atavin,
Шаблон функции есть однократно функция, выполняющая операции одной семантики с данными разных типов и описанная ровно один раз для всех типов своих параметров, она имеет один исходный текст своего тела для всех типов данных, к которым применима, а за различие внутренней реализации операций отвечает перегрузка используемых в ней операторов и вызываемых ею других функций, перегрузка самой функции выполняется автоматически.
Никто не отменял специализацию функций.
Шаблон же класса есть сокращённая запись нескольких классов, различающихся типами фактических членов и/или определёнными в этих классах константами, но не исходным текстом.
Опять же никто не отменял специализацию.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
08.05.2013, 09:44     Что такое шаблоны в C++? #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Никто не отменял специализацию функций.
Опять же никто не отменял специализацию. А вцелом верно, да.
Специализация - одна строчка для каждого набора типов и/или констант, целиком повторять весь исходный текст функции/класса не нужно.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.05.2013, 09:49  [ТС]     Что такое шаблоны в C++? #12
У меня еще вопрос:
Компилятора под рукой нет, поэтому если не затруднит, не могли бы написать, обязательно ли использовать ссылку :
C++
template < typename T>
void something(T &a) // обязательно & ?
{
    cout << "a = " << a << endl;
}
-=ЮрА=-
08.05.2013, 09:56
  #13

Не по теме:

Цитата Сообщение от programina Посмотреть сообщение
(T &a) // обязательно & ?
- конечно нет, ссылка идёт если параметр будет модернизироваться внутри тела функции

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.05.2013, 10:01     Что такое шаблоны в C++? #14
Цитата Сообщение от taras atavin Посмотреть сообщение
Специализация - одна строчка для каждого набора типов и/или констант, целиком повторять весь исходный текст функции/класса не нужно.
Зависит от специализации. Специализация специализации рознь.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.05.2013, 10:12  [ТС]     Что такое шаблоны в C++? #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

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

А в случае классов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class B
{
public:
    int a;
};
 
void something(B & b) // обязательно & ?
{
    b.a = 9;
}
 
int main()
{
    B b;
 
    b.a = 7;
 
    something(b);
    
    cout << b.a << endl;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.05.2013, 10:16     Что такое шаблоны в C++? #16
programina, Если вы хотите изменить объект в функции - да.
Если не хотите изменять - const ссылка.
Если хотите копировать - без ссылок.
Если хотите переместить(копировать) в зависимости от переданного объекта - без ссылок/rvalue ссылка
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.05.2013, 10:24  [ТС]     Что такое шаблоны в C++? #17
ForEveR, спасибо
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
08.05.2013, 14:09     Что такое шаблоны в C++? #18
Цитата Сообщение от programina Посмотреть сообщение
У меня еще вопрос:
Компилятора под рукой нет, поэтому если не затруднит, не могли бы написать, обязательно ли использовать ссылку :
Код C++
template < typename T>
void something(T &a) // обязательно & ?
{
* * cout << "a = " << a << endl;
}
Ссылка используется для изменяемых параметров, или ради экономии на размере фактически передаваемых данных, как и в любой обычной функции, или функции-члене.

Добавлено через 29 минут
Цитата Сообщение от ForEveR Посмотреть сообщение
Зависит от специализации. Специализация специализации рознь.
Зачем пытаться спорить с самим назначением шаблона во-первых для сокращения записи, а во-вторых для исключения ошибок при повторении всей реализации, а в случае класса и декларации тоже? Каждая отдельная специализация всегда короче шаблона и ни когда не повторяет всю реализацию, а в случае шаблона класса и всю декларацию, в специализации лишь указывается, для каких именно типов и значений надо создать версию шаблона.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.05.2013, 14:34     Что такое шаблоны в C++? #19
taras atavin,
в специализации лишь указывается, для каких именно типов и значений надо создать версию шаблона.
Вот тебе парочка специализаций из gcc.
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
  template<typename _Tp>
    struct numeric_limits : public __numeric_limits_base
    {
      /** The minimum finite value, or for floating types with
      denormalization, the minimum positive normalized value.  */
      static _GLIBCXX_CONSTEXPR _Tp
      min() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
 
      /** The maximum finite value.  */
      static _GLIBCXX_CONSTEXPR _Tp
      max() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
 
#if __cplusplus >= 201103L
      /** A finite value x such that there is no other finite value y
       *  where y < x.  */
      static constexpr _Tp
      lowest() noexcept { return _Tp(); }
#endif
 
      /** The @e machine @e epsilon:  the difference between 1 and the least
      value greater than 1 that is representable.  */
      static _GLIBCXX_CONSTEXPR _Tp
      epsilon() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
 
      /** The maximum rounding error measurement (see LIA-1).  */
      static _GLIBCXX_CONSTEXPR _Tp
      round_error() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
 
      /** The representation of positive infinity, if @c has_infinity.  */
      static _GLIBCXX_CONSTEXPR _Tp
      infinity() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
 
      /** The representation of a quiet Not a Number,
      if @c has_quiet_NaN. */
      static _GLIBCXX_CONSTEXPR _Tp
      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
 
      /** The representation of a signaling Not a Number, if
      @c has_signaling_NaN. */
      static _GLIBCXX_CONSTEXPR _Tp
      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
 
      /** The minimum positive denormalized value.  For types where
      @c has_denorm is false, this is the minimum positive normalized
      value.  */
      static _GLIBCXX_CONSTEXPR _Tp
      denorm_min() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
    };
 
#if __cplusplus >= 201103L
  template<typename _Tp>
    struct numeric_limits<const _Tp>
    : public numeric_limits<_Tp> { };
 
  template<typename _Tp>
    struct numeric_limits<volatile _Tp>
    : public numeric_limits<_Tp> { };
 
  template<typename _Tp>
    struct numeric_limits<const volatile _Tp>
    : public numeric_limits<_Tp> { };
#endif
 
  // Now there follow 16 explicit specializations.  Yes, 16.  Make sure
  // you get the count right. (18 in c++0x mode)
 
  /// numeric_limits<bool> specialization.
  template<>
    struct numeric_limits<bool>
    {
      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
 
      static _GLIBCXX_CONSTEXPR bool 
      min() _GLIBCXX_USE_NOEXCEPT { return false; }
 
      static _GLIBCXX_CONSTEXPR bool 
      max() _GLIBCXX_USE_NOEXCEPT { return true; }
 
#if __cplusplus >= 201103L
      static constexpr bool
      lowest() noexcept { return min(); }
#endif
      static _GLIBCXX_USE_CONSTEXPR int digits = 1;
      static _GLIBCXX_USE_CONSTEXPR int digits10 = 0;
#if __cplusplus >= 201103L
      static constexpr int max_digits10 = 0;
#endif
      static _GLIBCXX_USE_CONSTEXPR bool is_signed = false;
      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
 
      static _GLIBCXX_CONSTEXPR bool 
      epsilon() _GLIBCXX_USE_NOEXCEPT { return false; }
 
      static _GLIBCXX_CONSTEXPR bool 
      round_error() _GLIBCXX_USE_NOEXCEPT { return false; }
 
      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
 
      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm 
       = denorm_absent;
      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
 
      static _GLIBCXX_CONSTEXPR bool 
      infinity() _GLIBCXX_USE_NOEXCEPT { return false; }
 
      static _GLIBCXX_CONSTEXPR bool 
      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return false; }
 
      static _GLIBCXX_CONSTEXPR bool 
      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return false; }
 
      static _GLIBCXX_CONSTEXPR bool 
      denorm_min() _GLIBCXX_USE_NOEXCEPT { return false; }
 
      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false;
 
      // It is not clear what it means for a boolean type to trap.
      // This is a DR on the LWG issue list.  Here, I use integer
      // promotion semantics.
      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style 
       = round_toward_zero;
    };
 
  /// numeric_limits<char> specialization.
  template<>
    struct numeric_limits<char>
    {
      static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
 
      static _GLIBCXX_CONSTEXPR char 
      min() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_min(char); }
 
      static _GLIBCXX_CONSTEXPR char 
      max() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_max(char); }
 
#if __cplusplus >= 201103L
      static constexpr char 
      lowest() noexcept { return min(); }
#endif
 
      static _GLIBCXX_USE_CONSTEXPR int digits = __glibcxx_digits (char);
      static _GLIBCXX_USE_CONSTEXPR int digits10 = __glibcxx_digits10 (char);
#if __cplusplus >= 201103L
      static constexpr int max_digits10 = 0;
#endif
      static _GLIBCXX_USE_CONSTEXPR bool is_signed = __glibcxx_signed (char);
      static _GLIBCXX_USE_CONSTEXPR bool is_integer = true;
      static _GLIBCXX_USE_CONSTEXPR bool is_exact = true;
      static _GLIBCXX_USE_CONSTEXPR int radix = 2;
 
      static _GLIBCXX_CONSTEXPR char 
      epsilon() _GLIBCXX_USE_NOEXCEPT { return 0; }
 
      static _GLIBCXX_CONSTEXPR char 
      round_error() _GLIBCXX_USE_NOEXCEPT { return 0; }
 
      static _GLIBCXX_USE_CONSTEXPR int min_exponent = 0;
      static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = 0;
      static _GLIBCXX_USE_CONSTEXPR int max_exponent = 0;
      static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 0;
 
      static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
      static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm 
       = denorm_absent;
      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
 
      static _GLIBCXX_CONSTEXPR 
      char infinity() _GLIBCXX_USE_NOEXCEPT { return char(); }
 
      static _GLIBCXX_CONSTEXPR char 
      quiet_NaN() _GLIBCXX_USE_NOEXCEPT { return char(); }
 
      static _GLIBCXX_CONSTEXPR char 
      signaling_NaN() _GLIBCXX_USE_NOEXCEPT { return char(); }
 
      static _GLIBCXX_CONSTEXPR char 
      denorm_min() _GLIBCXX_USE_NOEXCEPT { return static_cast<char>(0); }
 
      static _GLIBCXX_USE_CONSTEXPR bool is_iec559 = false;
      static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true;
      static _GLIBCXX_USE_CONSTEXPR bool is_modulo = !is_signed;
 
      static _GLIBCXX_USE_CONSTEXPR bool traps = __glibcxx_integral_traps;
      static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false;
      static _GLIBCXX_USE_CONSTEXPR float_round_style round_style 
       = round_toward_zero;
    };
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2013, 14:37     Что такое шаблоны в C++?
Еще ссылки по теме:

Что за пустые шаблоны template <> struct/inline? C++
Что такое шаблоны функций? C++
В этой части кода происходит объявление функций? Что такое void? Что в скобках? C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
08.05.2013, 14:37     Что такое шаблоны в C++? #20
Цитата Сообщение от taras atavin Посмотреть сообщение
в специализации лишь указывается, для каких именно типов и значений надо создать версию шаблона.
А так же изменение работы класса, если это необходимо
Yandex
Объявления
08.05.2013, 14:37     Что такое шаблоны в C++?
Ответ Создать тему
Опции темы

Текущее время: 10:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru