Я пытаюсь понять шаблон класса в C ++. Во-первых, я хотел бы понять, что означает эта строка:
template <typename T, typename Ord = columns, typename All = abc::allocator<T,16> >
class matrix
где столбцы и распределитель являются соответственно структурой и классом, определенным где-то еще (второй в пространстве имен abc). Что меня беспокоит, так это тот факт, что у него есть имя, которое уже было инициализировано. Что это значит? Должен ли я также инициализировать имя типа Ord и All, когда я хочу использовать этот шаблон?
Кроме того, есть также этот единственный конструктор:
explicit matrix(unsigned int rows = 0, unsigned int cols = 0, T init = T())
но, похоже, он уже был инициализирован. А что должно означать init?
Уверяю вас, что я посмотрел весь код, но нет ничего, что помогает лучше понять. Спасибо за Ваше внимание.
Изменить: Спасибо всем за ваши ответы. Просто небольшое заверение (я нуб в C ++):
int const& operator() operator()(unsigned int i, unsigned int j) const
Этот метод означает, что когда мы инициализируем класс foo, мы можем вызвать его с помощью foo () (1,2), где i = 1 и j = 2. Я прав? И что означают два «const»?
Еще раз спасибо!
template <typename T, typename Ord = columns, typename All = abc::allocator<T,16> >
class matrix
{
//...
};
Это параметры шаблона по умолчанию, они работают как аргументы функций по умолчанию — вы можете указать их, но если вы этого не сделаете, они по умолчанию.
И вы можете увидеть пример использования стандартных аргументов функции.
Итог — все следующие строки верны:
matrix<int> a; // matrix<int, columns, abc::allocator<int, 16> >
matrix<int, rows> b; // matrix<int, rows, abc::allocator<int, 16> >
matrix<int, columns, abc::other_allocator<int, 32> > c; // obvious
matrix<int> a = matrix<int>(); // constructor called with 0, 0 and
// int() - default constructed T - in this case, int - as arguments
matrix<int> a(1, 2); // constructor called with 1, 2 and int() as arguments
matrix<int> a(1, 2, 100); // obvious
Это означает, что пользователь класса установил разумное значение по умолчанию — например, вы Можно предоставить один, но вы не иметь к. То же самое относится и к аргументам конструктора. Что касается аргументов, только вы можете ответить на это.
Это значение по умолчанию. Если аргумент шаблона не указан, он будет принят по умолчанию.
Также как у вас есть значения по умолчанию в функциях:
void blah(int a = 0) { }
Как вы знаете, в C ++ аргументы функций могут иметь значения по умолчанию, и в случае, если пользователь не предоставляет эти параметры, компилятор C ++ использует для них это значение по умолчанию.
Сейчас в конструкторе init
имеет значение по умолчанию T()
что означает значение типа, используя его конструктор по умолчанию, например, если T=int
затем T()
имею в виду 0
и если это std::string
это пустая строка. Вы даже можете использовать этот синтаксис для других параметров:
explicit matrix(
unsigned int rows = unsigned int(),
unsigned int cols = unsigned int(),
T init = T());