Поделиться через


Аргументы по умолчанию для шаблонов классов

Шаблоны класса могут иметь аргументы по умолчанию для параметров типов или значений. Аргументы по умолчанию задаются со знаком "равно" (=) с последующим именем или значением типа. При наличии нескольких аргументов шаблона все аргументы после первого аргумента по умолчанию должны иметь аргументы по умолчанию. При объявлении объекта класса шаблона с аргументами по умолчанию опускайте аргументы, чтобы использовались аргументы по умолчанию. При наличии аргументов, отличных от аргументов по умолчанию, не опускайте пустые угловые скобки.

Шаблон, объявленный многократно, не может задавать аргумент по умолчанию более одного раза. В следующем коде демонстрируется ошибка.

template <class T = long> class A;
template <class T = long> class A { /* . . . */ }; // Generates C4348.

Пример

В приведенном ниже примере шаблон класса массива определяется с типом по умолчанию int для элемента массива и значением по умолчанию для параметра шаблона, определяющего размер.

// template_default_arg.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

template <class T = int, int size = 10> class Array
{
   T* array;
public:
   Array()
   {
      array = new T[size];
      memset(array, 0, size * sizeof(T));
   }
   T& operator[](int i)
   {
      return *(array + i);
   }
   const int Length() { return size; }
   void print()
   {
      for (int i = 0; i < size; i++)
      {
         cout << (*this)[i] << " ";
      }
      cout << endl;
   }
};

int main()
{
   // Explicitly specify the template arguments:
   Array<char, 26> ac;
   for (int i = 0; i < ac.Length(); i++)
   {
      ac[i] = 'A' + i;
   }
   ac.print();
   
   // Accept the default template arguments:
   Array<> a; // You must include the angle brackets.
   for (int i = 0; i < a.Length(); i++)
   {
      a[i] = i*10;
   }
   a.print();
}
  

См. также

Ссылки

Аргументы по умолчанию