2010-07-20 2 views
3

есть разница, от предполагаемого метапрограммирования, например, между двумя объявлениями ?Объявление typedef класса шаблона

template<typename T> 
struct matrix { 
    typedef matrix self_type; // or 
    typedef matrix<T> self_type; 
}; 

спасибо

+0

К 'STRUCT матрицы {' ​​Я думаю, что вы имеете в виду 'STRUCT матрицу {'. – kennytm

+0

@ Kenny Спасибо, исправлено: – Anycorn

ответ

6

В этой конкретной ситуации (внутри шаблона класса) matrix является сокращением на matrix<T>. Когда вы пишете много волосатых шаблонов весь день, пытаясь вместить все в 80 столбцов, стенография приветствуется.

Обратите внимание, что вы можете также сокращайте аргументы метода:

template <typename T> 
struct matrix 
{ 
    typedef matrix my_type; 
    matrix(); // constructor is abbreviated too 
    matrix& operator=(matrix); 
}; 

// Method argument types can be abbreviated too 
// but not result types. 
template <typename T> 
matrix<T>& matrix<T>::operator=(matrix m) 
{ 
    // ... 
} 
+5

Обратите внимание, что этот термин является * введенным именем класса *, и к исходному шаблону можно получить доступ с использованием квалифицированного имени типа ':: matrix'. –

0

Они оба относятся к одному типу. Единственное различие, которое я вижу, - с точки зрения производительности: Я полагаю (в зависимости от реализации компилятора), только матрица ссылается на сам класс, поэтому ему ничего не нужно от среды. матрица говорит о шаблонной матрице классов, шаблон которой T (т. е. матрица), поэтому, возможно, для компилятора, возможно, потребуется больше механизмов вычитания. Но я просто догадываюсь, я никогда ничего не читал об этом.

Смежные вопросы