C ++ шаблон typedef

369

У меня есть класс

template<size_t N, size_t M>
class Matrix {
    // ....
};

Я хочу сделать a, typedefкоторый создает Vector(вектор столбца), который эквивалентен a Matrixс размерами N и 1. Что-то вроде этого:

typedef Matrix<N,1> Vector<N>;

Что приводит к ошибке компиляции. Следующее создает нечто подобное, но не совсем то, что я хочу:

template <size_t N>
class Vector: public Matrix<N,1>
{ };

Есть ли решение или не слишком дорогой обходной путь / лучшие практики для него?

Notinlist
источник

Ответы:

550

В C ++ 11 добавлены объявления псевдонимов , которые являются обобщением typedef, разрешающим шаблоны:

template <size_t N>
using Vector = Matrix<N, 1>;

Тип Vector<3>эквивалентен Matrix<3, 1>.


В C ++ 03 самым близким приближением было:

template <size_t N>
struct Vector
{
    typedef Matrix<N, 1> type;
};

Здесь тип Vector<3>::typeэквивалентен Matrix<3, 1>.

GManNickG
источник
45
О, отлично, я не видел эту часть C ++ 0x, и я некоторое время мучился с шаблонным typedef ... думаю, мне нужно более внимательно прочитать окончательный вариант.
Матье М.
2
Сделают ли наследующие конструкторы оригинальное решение ОП более жизнеспособным?
StackedCrooked
2
@StackedCrooked: зависит от его целей. Я избегаю наследования, когда будет работать состав (и да, наследующие конструкторы облегчат оба этих процесса), но я также избегаю составления, когда это сделает typedef.
GManNickG
1
Использование не поддерживает специализацию, если я не ошибаюсь, поэтому второй вариант все еще полезен во многих случаях.
Уткарш Бхардвадж