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

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

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

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

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

Что такое шаблоны и для чего они нужны? Если не трудно приведите показательный пример применения шаблона.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2013, 07:49     Что такое шаблоны в C++?
Посмотрите здесь:
Что такое шаблоны функций? C++
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами? C++
C++ Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
C++ Что такое хэндлер файла? Что такое файловый указатель?
Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них C++
Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере C++
Что такое перегрузка оператора? Что у меня в коде за ошибка? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
08.05.2013, 10:16     Что такое шаблоны в C++? #16
programina, Если вы хотите изменить объект в функции - да.
Если не хотите изменять - const ссылка.
Если хотите копировать - без ссылок.
Если хотите переместить(копировать) в зависимости от переданного объекта - без ссылок/rvalue ссылка
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.05.2013, 10:24  [ТС]     Что такое шаблоны в C++? #17
ForEveR, спасибо
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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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;
    };
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
08.05.2013, 14:37     Что такое шаблоны в C++? #20
Цитата Сообщение от taras atavin Посмотреть сообщение
в специализации лишь указывается, для каких именно типов и значений надо создать версию шаблона.
А так же изменение работы класса, если это необходимо
Tulosba
08.05.2013, 14:58
  #21

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
// Now there follow 16 explicit specializations. Yes, 16. Make sure // you get the count right. (18 in c++0x mode)
Странное кол-во. Я насчитал 20.

taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
08.05.2013, 15:42     Что такое шаблоны в C++? #22
Цитата Сообщение от ForEveR Посмотреть сообщение
template<typename _Tp>
* * struct numeric_limits : public __numeric_limits_base
* * {
это уже больше на сам шаблон похоже.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
08.05.2013, 16:37     Что такое шаблоны в C++? #23
taras atavin, Это и есть шаблон.) А ниже специализации.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.05.2013, 15:47     Что такое шаблоны в C++? #24
Где?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.05.2013, 16:30     Что такое шаблоны в C++? #25
Цитата Сообщение от taras atavin Посмотреть сообщение
Где?
gcc ... include/limits
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
09.05.2013, 17:39     Что такое шаблоны в C++? #26
taras atavin, В коде же. Или вы код не читали? Первый класс - шаблон, дальше идут специализации.
C++
1
2
template<>
struct numeric_limits<bool>
Ежели что является специализацией.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.05.2013, 18:16     Что такое шаблоны в C++? #27
Цитата Сообщение от ForEveR Посмотреть сообщение
template<>
struct numeric_limits<bool>
эти две строки одинаково не проблема и растянуть на 4 строки, и ужать в одну. Это отменяет тот факт, что данный фрагмент короче даже функции-заглушки?

Добавлено через 2 минуты
Даже целиком
C++
1
2
3
template<typename _Tp>
    struct numeric_limits<const _Tp>
    : public numeric_limits<_Tp> { };
можно превратить хоть в
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template
<typename
_Tp>
struct
numeric_limits
<const
_Tp>
:
public
numeric_limits
<_Tp>
{
};
, хоть ужать в
C++
1
template<typename _Tp> struct numeric_limits<const _Tp>: public numeric_limits<_Tp> { };
Так и так запись по краткости конкурирует с заглушкой.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
09.05.2013, 18:23     Что такое шаблоны в C++? #28
taras atavin, ТЫ код читал? Зачем ты мне приводишь специализацию на const T, когда там есть специализации на стандартные типы, которые больше шаблонного класса по объему и полям?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.05.2013, 21:07     Что такое шаблоны в C++? #29
Где?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2013, 21:20     Что такое шаблоны в C++?
Еще ссылки по теме:
В этой части кода происходит объявление функций? Что такое void? Что в скобках? C++
C++ Шаблоны. Что я не так делаю?
C++ Что такое #, include, что это означает
Шаблоны без параметров, что это? C++
Что за пустые шаблоны template <> struct/inline? C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
09.05.2013, 21:20     Что такое шаблоны в C++? #30
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
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
  /// 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;
    };
Yandex
Объявления
09.05.2013, 21:20     Что такое шаблоны в C++?
Ответ Создать тему
Опции темы

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