Странные имена типов и конструктор в шаблоне

Я пытаюсь понять класс шаблона на С++. Во-первых, я хотел бы понять, что означает эта строка:

template <typename T, typename Ord = columns, typename All = abc::allocator<T,16> >
class matrix

где столбцы и распределитель — это соответственно структура и класс, определенные где-то еще (второй в пространстве имен abc). Что меня беспокоит, так это тот факт, что у него, кажется, уже инициализированное имя типа. Что это значит? Должен ли я также инициализировать имя типа Ord and All, когда я хочу использовать этот шаблон?

Кроме того, есть и этот единственный конструктор:

explicit matrix(unsigned int rows = 0, unsigned int cols = 0, T init = T())

но он, кажется, уже был инициализирован. И что должно означать init?

Уверяю вас, что я просмотрел весь код, но ничего не помогает лучше понять. Спасибо за внимание.

Редактировать: Спасибо всем за ваши ответы. Просто небольшое утешение (я нуб в С++):

int const& operator() operator()(unsigned int i, unsigned int j) const

Этот метод означает, что когда мы инициализируем класс foo, мы можем вызывать его с помощью foo()(1,2), где i=1 и j=2. Я прав? И к чему относятся два "const"?

Еще раз спасибо!


person Pippo    schedule 21.10.2012    source источник


Ответы (4)


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
person Griwes    schedule 21.10.2012

Это означает, что пользователь класса установил разумное значение по умолчанию — например, вы можете предоставить его, но не обязаны. То же самое относится и к аргументам конструктора. Что касается того, что означают аргументы, на это можете ответить только вы.

person Puppy    schedule 21.10.2012
comment
Спасибо за ваш ответ. Однако T() (который определен только там) кажется, что init должен быть чем-то пустым. Я прав? - person Pippo; 21.10.2012
comment
@Pippo Выражение T() возвращает инициализированный значением объект типа T — ноль для числовых типов и объект, построенный по умолчанию, для типов классов. - person Philipp; 21.10.2012
comment
Если у него есть конструктор по умолчанию. В противном случае он будет инициализировать каждый элемент - person Puppy; 22.10.2012

Это значение по умолчанию. Если аргумент шаблона не указан, он примет значение по умолчанию.
Точно так же, как у вас есть значения по умолчанию в функциях:

void blah(int a = 0) { }
person Yochai Timmer    schedule 21.10.2012

Как вы знаете, аргументы функций С++ могут иметь значения по умолчанию, и если пользователь не предоставляет эти параметры, компилятор С++ использует для них это значение по умолчанию. Теперь в конструкторе init имеет значение по умолчанию T(), что означает значение типа, использующее его конструктор по умолчанию, например, если T=int, то T() означает 0, а если это std::string, это пустая строка. Вы даже можете использовать этот синтаксис для других параметров:

explicit matrix(
    unsigned int rows = unsigned int(),
    unsigned int cols = unsigned int(),
    T init = T());
person BigBoss    schedule 21.10.2012