объявление typedef шаблона класса - PullRequest
3 голосов
/ 20 июля 2010

Есть ли разница, например, с точки зрения метапрограммирования, между двумя декларациями?

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

спасибо

Ответы [ 2 ]

6 голосов
/ 21 июля 2010

В этой конкретной ситуации (внутри шаблона класса) 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)
{
    // ...
}
0 голосов
/ 21 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...