Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/33: Рейтинг темы: голосов - 33, средняя оценка - 4.58
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2

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

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

Студворк — интернет-сервис помощи студентам
Что такое шаблоны и для чего они нужны? Если не трудно приведите показательный пример применения шаблона.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.05.2013, 07:49
Ответы с готовыми решениями:

Что такое шаблоны функций?
Люди обясните пожалуйста шаблоны функций На заннятиях чучуть провтыкал помогите вы буду благодарен!!

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

49
08.05.2013, 14:58
Студворк — интернет-сервис помощи студентам

Не по теме:

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

1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
08.05.2013, 15:42
Цитата Сообщение от ForEveR Посмотреть сообщение
template<typename _Tp>
* * struct numeric_limits : public __numeric_limits_base
* * {
это уже больше на сам шаблон похоже.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.05.2013, 16:37
taras atavin, Это и есть шаблон.) А ниже специализации.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
09.05.2013, 15:47
Где?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.05.2013, 16:30
Цитата Сообщение от taras atavin Посмотреть сообщение
Где?
gcc ... include/limits
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.05.2013, 17:39
taras atavin, В коде же. Или вы код не читали? Первый класс - шаблон, дальше идут специализации.
C++
1
2
template<>
struct numeric_limits<bool>
Ежели что является специализацией.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
09.05.2013, 18:16
Цитата Сообщение от 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> { };
Так и так запись по краткости конкурирует с заглушкой.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.05.2013, 18:23
taras atavin, ТЫ код читал? Зачем ты мне приводишь специализацию на const T, когда там есть специализации на стандартные типы, которые больше шаблонного класса по объему и полям?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
09.05.2013, 21:07
Где?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.05.2013, 21:20
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;
    };
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
10.05.2013, 19:06
Объясни, в чём тогда смысл шаблона при такой зверской специализации.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.05.2013, 20:14
taras atavin, Чтобы использовать numeric_limits<type>::blabla, а не numeric_int_limits::blabla. Во-первых - люто помогает в шаблонах, не нужно ведь знать ТОЧНЫЙ тип, во-вторых просто более эстетично.
Специализация, вообще говоря, может быть любого размера, она создается для конкретного типа, чтобы указать, что для данного конкретного типа, значения/функции/действия именно такие. Специализация шаблонного класса - это полное переопределение полей/функций шаблонного класса, просто потому, что ты не можешь унаследоваться от класса, который специализируешь (только написать некие общие traits, для полей/функций/действий, который не зависят от конкретного типа).
C++
1
2
3
4
5
6
7
8
9
template<typename T>
class F
{
};
 
template<>
class F<int> : public F<int>
{
};
Очевидно не является корректным кодом. Тоже самое с функциями, ты не сможешь вызвать из специализированной версии шаблонную версию (используя тот же шаблонный параметр).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct FTraits
{
   typedef void void_type;
};
 
template<typename T>
struct F : FTraits
{
   static constexpr int value = 0;
};
 
template<>
struct F<int> : Ftraits
{
   static constexpr int value = std::numeric_limits<int>::max();
};
 
static_assert(std::is_same<F<int>::void_type, F<double>::void_type>::value, "Not same");
static_assert(F<int>::value != F<double>::value, "Equals in primary and in spec");
 
int main() {}
А это вполне себе ок.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.05.2013, 14:29
Цитата Сообщение от ForEveR Посмотреть сообщение
это полное переопределение полей/функций шаблонного класса, просто потому, что ты не можешь унаследоваться от класса, который специализируешь (только написать некие общие traits, для полей/функций/действий, который не зависят от конкретного типа).
Но на основе ранее определённого шаблона и автоматическое, а если каждый конкретный класс определять вручную, то он не будет параметризованным, а значит и не должен будет быть шаблонным.

Добавлено через 2 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
template<typename T>
class F
{
};
template<>
class F<int> : public F<int>
{
};
Очевидно не является корректным кодом.
Я спросил, где пример специализации, твой ответ не является корректным кодом.

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
ты не сможешь вызвать из специализированной версии шаблонную версию
Вызов то прописан в шаблоне.

Добавлено через 2 минуты
Шаблон:
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
#ifndef TARRAY_HPP_INCLUDED
#define TARRAY_HPP_INCLUDED
//=================================================================================================
template <class TItem> class TArray
{
//-------------------------------------------------------------------------------------------------
 protected:
//-------------------------------------------------------------------------------------------------
  TItem             *Data;
  size_t             Count;
//-------------------------------------------------------------------------------------------------
 public   :
//-------------------------------------------------------------------------------------------------
                     TArray          (                          );
                     TArray          (TArray           &Original);
//-------------------------------------------------------------------------------------------------
                    ~TArray          (                          );
//-------------------------------------------------------------------------------------------------
  TArray             operator =      (const
                                      TArray           &Original);
//-------------------------------------------------------------------------------------------------
  TItem             &operator []     (size_t            Index   );
//-------------------------------------------------------------------------------------------------
                     operator bool   (                          );
                     operator size_t (                          );
//-------------------------------------------------------------------------------------------------
  bool               ReSieze         (size_t            Count   );
//-------------------------------------------------------------------------------------------------
};
//=================================================================================================
template
<class TItem>
TArray <TItem> ::    TArray          (                          )
{
 Data =NULL;
 Count=0;
}
//-------------------------------------------------------------------------------------------------
template
<class TItem>
TArray <TItem> ::    TArray          (TArray           &Original)
{
 TItem *Source;
 TItem *Target;
 if (Original.Count>0)
 {
  Data=new TItem [Original.Count];
  if (Data)
  {
   for (Source=Original.Data+Original.Count-1, Target=Data+Original.Count-1; Target>=Data; --Source, --Target)
   {
    *Target=*Source;
   }
   Count=Original.Count;
  }
  else
  {
   Count=0;
  }
 }
 else
 {
  Data =NULL;
  Count=0;
 }
}
//-------------------------------------------------------------------------------------------------
template
<class TItem>
TArray <TItem> ::   ~TArray          (                          )
{
 if (Data)
 {
  delete [] Data;
 }
 Data =NULL;
 Count=0;
}
//-------------------------------------------------------------------------------------------------
template
<class TItem>
TArray <TItem>
TArray <TItem> ::    operator =      (const
                                      TArray           &Original)
{
 TItem *Source;
 TItem *Target;
 if (Original.Count>0)
 {
  Data=new TItem [Original.Count];
  if (Data)
  {
   for (Source=Original.Data+Original.Count-1, Target=Data+Original.Count-1; Target>=Data; --Source, --Target)
   {
    *Target=*Source;
   }
   Count=Original.Count;
  }
  else
  {
   Count=0;
  }
 }
 else
 {
  Data =NULL;
  Count=0;
 }
 return *this;
}
//-------------------------------------------------------------------------------------------------
template
<class TItem>
TItem               &
TArray <TItem> ::    operator []     (size_t            Index   )
{
 return Data[Index];
}
//-------------------------------------------------------------------------------------------------
template
<class TItem>
TArray <TItem> ::    operator bool   (                          )
{
 return (Count>0);
}
//-------------------------------------------------------------------------------------------------
template
<class TItem>
TArray <TItem> ::    operator size_t (                          )
{
 return Count;
}
//-------------------------------------------------------------------------------------------------
template
<class TItem>
bool
TArray <TItem> ::    ReSieze         (size_t            Count   )
{
 TItem  *Buffer;
 TItem  *Source;
 TItem  *Target;
 size_t  ForCopy;
 if (Count<(std::numeric_limits<size_t>::max()/sizeof(TItem)))
 {
  if (Count==0)
  {
   if (Data)
   {
    delete [] Data;
   }
         Data =0;
   this->Count=0;
   return true;
  }
  else
  {
   Buffer=new TItem [Count];
   if (Buffer)
   {
    if (Count>this->Count)
    {
     ForCopy=this->Count;
    }
    else
    {
     ForCopy=Count;
    }
    if (ForCopy>0)
    {
     for (Source=Data+ForCopy-1, Target=Buffer+ForCopy-1; Source>=Data; --Source, --Target)
     {
      *Target=*Source;
     }
    }
    if (Data)
    {
     delete [] Data;
    }
          Data =Buffer;
    this->Count=Count;
    return true;
   }
   else
   {
    return false;
   }
  }
 }
 return false;
}
//=================================================================================================
#endif // TARRAY_HPP_INCLUDED
, специализация:
C++
1
TArray <TStaffList>         StaffLists;
, всё отлично вызывается.

Добавлено через 6 минут
Шаблон есть фрагмент программы, формальные параметры которого есть типы, специализация шаблона есть использующий шаблон фрагмент программы, фактические параметры которого есть типы и в котором нет формальных параметров, являющихся типами. Кроме шаблонов фактические параметры водятся только в вызовах подпрограмм. Где видано, чтоб вызов повторял определение функции?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
11.05.2013, 14:56
Цитата Сообщение от taras atavin Посмотреть сообщение
Шаблон есть фрагмент программы, формальные параметры которого есть типы
не только типы, целочисленные литералы

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
, специализация:
C++
1
TArray <TStaffList>  StaffLists;
Цитата Сообщение от taras atavin Посмотреть сообщение
специализация шаблона есть использующий шаблон фрагмент программы
нет, это инстанцирование шаблона
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.05.2013, 14:59
Цитата Сообщение от Jupiter Посмотреть сообщение
е только типы, целочисленные литералы
А каково назначение этих чисел? Это опять таки информация о типе, например, в шаблоне ограниченного массива это количество элементов.

Добавлено через 23 секунды
Цитата Сообщение от Jupiter Посмотреть сообщение
нет, это инстанцирование шаблона
Почитай ка Шилдта.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
11.05.2013, 15:01
Цитата Сообщение от taras atavin Посмотреть сообщение
Почитай ка Шилдта.
почитай ка Вандервуда, у него целая книга посвящена шаблонам с++, Шилдт и рядом не валялся

Добавлено через 28 секунд
Цитата Сообщение от taras atavin Посмотреть сообщение
А каково назначение этих чисел? Это опять таки информация о типе, например, в шаблоне ограниченного массива это количество элементов.
банальный расчет факториала во время компиляции
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.05.2013, 15:11
Цитата Сообщение от Jupiter Посмотреть сообщение
почитай ка Вандервуда, у него целая книга посвящена шаблонам с++
Как и у Шилдта. И объясни ка, как можно инстанцировать шаблонный класс, при этом его не специализировав.

Добавлено через 1 минуту
Цитата Сообщение от Jupiter Посмотреть сообщение
банальный расчет факториала во время компиляции
На каждое значение обычного параметра создавать версию функции? Это уже изврат шаблона, а не шаблон. Для факториала ещё может и не так расточительно, очень уж быстро он растёт, а для остальных это лучший способ израсходовать всю память на фигню.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
11.05.2013, 15:24
Taras atavin, можно я расскажу вам одну вещь в надежде на то, что поток тупых вопросов и философствования иссякнет?

Шаблоны C++ — это не дженерики. С их помощью можно эмулировать дженерики (читай: параметрически полиморфные типы), но они этим не ограничиваются.
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.05.2013, 15:26
Я вообще не знаю, кто такие дженерики.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
11.05.2013, 15:32
Это когда какой-нибудь List<T> представляется внутри языка именно как List<T>. Не преобразуется в кучу отдельных List__int, List__zog, List__bork. Из-за этого определения внутри List<T> ограничены исключительно подстановками конкретного типа вместо T и никакой специализации дженериков быть не может.

Вот дженерики истинно шаблонны: есть определение класса/метода и оно фиксировано. Всё, что позволено, — это подставить вместо T конкретный тип. А темплейты позволяют извращаться с помощью специализации. Не надо укладывать их в прокрустово ложе дженериков.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.05.2013, 15:32

Что такое хэндлер файла? Что такое файловый указатель?
Что такое хэндлер файла? Что такое файловый указатель?

Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них
Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них пожалуйста.

Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере
Есть класс, содержащий объекты и конструктор. Конструктор объявляется в одном из cpp файлов(их несколько). Можно ли, как-то, использовать...

Что такое перегрузка оператора? Что у меня в коде за ошибка?
Что же я написал?? Что оно не компилится? Что значит error C2275: Superclass: недопустимое использование этого типа в качестве выражения ...

Шаблоны. Что я не так делаю?
#ifndef _TSTACK_H_ #define _TSTACK_H_ ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru