я написал общий класс матрицы следующим образом:Как частично специализировать шаблонный класс C++?
template <std::size_t N, std::size_t M, class T>
class CMatrix
{
protected:
T* m_elem;
public:
CMatrix() : m_elem(new T[N*M]) {}
~CMatrix() { delete[] m_elem; }
inline bCMatrix& operator*=(const T& val);
inline bCMatrix& operator/=(const T& val);
...
template <std::size_t L> inline CMatrix<L, N, T> operator*(const CMatrix<M, L, T>& mat) const;
};
Теперь я хотел бы сделать несколько специализаций для CMatrix < 2,2, T>. Я хотел бы добавить компромисс CMatrix<2,2,T>(const T& a00, const T& a01, const T& a10, const T& a11) {...}
. И мне нравится специализировать матричное умножение для CMatrix < 2x2> * CMatrix < 2x2>. Но, с другой стороны, я хотел бы сохранить функции * = и/= и т. Д.
Как мне это сделать?
Моя единственная рабочая попытка переписать (копировать/прошлое/поиск/замена) весь код для специализации N = 3, M = 3, как:
template <class T>
class CMatrix<3,3,T>
{
...
};
Теперь я могу специализировать матричным матричное умножение для 2x2. Но у меня есть два почти одинаковых фрагмента кода, например, один для умножения матричных векторов и один для умножения матрицы-вектора с матрицей 2x2. Который должен быть изменен, если я оптимизирую общий. Отстойно это поддерживать.
Каковы ваши попытки? – sgvd
'template class CMatrix <2, 2, T> {};' –
Cornstalks
Сначала я хотел бы спросить, почему вы используете указатель с динамическим распределением вместо массива? Поскольку 'N' и' M' известны во время компиляции, вы можете просто использовать 'T m_elem [N * M];' – NathanOliver