Форум программистов, компьютерный форум 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
08.05.2013, 14:58     Что такое шаблоны в C++?
  #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
Ушёл с форума.
 Аватар для 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.05.2013, 16:37     Что такое шаблоны в C++? #23
taras atavin, Это и есть шаблон.) А ниже специализации.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.05.2013, 15:47     Что такое шаблоны в C++? #24
Где?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
09.05.2013, 16:30     Что такое шаблоны в C++? #25
Цитата Сообщение от taras atavin Посмотреть сообщение
Где?
gcc ... include/limits
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.05.2013, 17:39     Что такое шаблоны в C++? #26
taras atavin, В коде же. Или вы код не читали? Первый класс - шаблон, дальше идут специализации.
C++
1
2
template<>
struct numeric_limits<bool>
Ежели что является специализацией.
taras atavin
Ушёл с форума.
 Аватар для 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.05.2013, 18:23     Что такое шаблоны в C++? #28
taras atavin, ТЫ код читал? Зачем ты мне приводишь специализацию на const T, когда там есть специализации на стандартные типы, которые больше шаблонного класса по объему и полям?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.05.2013, 21:07     Что такое шаблоны в C++? #29
Где?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
    };
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.05.2013, 19:06     Что такое шаблоны в C++? #31
Объясни, в чём тогда смысл шаблона при такой зверской специализации.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.05.2013, 20:14     Что такое шаблоны в C++? #32
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() {}
А это вполне себе ок.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.05.2013, 14:29     Что такое шаблоны в C++? #33
Цитата Сообщение от 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 минут
Шаблон есть фрагмент программы, формальные параметры которого есть типы, специализация шаблона есть использующий шаблон фрагмент программы, фактические параметры которого есть типы и в котором нет формальных параметров, являющихся типами. Кроме шаблонов фактические параметры водятся только в вызовах подпрограмм. Где видано, чтоб вызов повторял определение функции?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.05.2013, 14:56     Что такое шаблоны в C++? #34
Цитата Сообщение от taras atavin Посмотреть сообщение
Шаблон есть фрагмент программы, формальные параметры которого есть типы
не только типы, целочисленные литералы

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

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

Добавлено через 28 секунд
Цитата Сообщение от taras atavin Посмотреть сообщение
А каково назначение этих чисел? Это опять таки информация о типе, например, в шаблоне ограниченного массива это количество элементов.
банальный расчет факториала во время компиляции
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.05.2013, 15:11     Что такое шаблоны в C++? #37
Цитата Сообщение от Jupiter Посмотреть сообщение
почитай ка Вандервуда, у него целая книга посвящена шаблонам с++
Как и у Шилдта. И объясни ка, как можно инстанцировать шаблонный класс, при этом его не специализировав.

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

Шаблоны C++ — это не дженерики. С их помощью можно эмулировать дженерики (читай: параметрически полиморфные типы), но они этим не ограничиваются.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.05.2013, 15:26     Что такое шаблоны в C++? #39
Я вообще не знаю, кто такие дженерики.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2013, 15:32     Что такое шаблоны в C++?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
11.05.2013, 15:32     Что такое шаблоны в C++? #40
Это когда какой-нибудь List<T> представляется внутри языка именно как List<T>. Не преобразуется в кучу отдельных List__int, List__zog, List__bork. Из-за этого определения внутри List<T> ограничены исключительно подстановками конкретного типа вместо T и никакой специализации дженериков быть не может.

Вот дженерики истинно шаблонны: есть определение класса/метода и оно фиксировано. Всё, что позволено, — это подставить вместо T конкретный тип. А темплейты позволяют извращаться с помощью специализации. Не надо укладывать их в прокрустово ложе дженериков.
Yandex
Объявления
11.05.2013, 15:32     Что такое шаблоны в C++?
Ответ Создать тему
Опции темы

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