Я создаю библиотеку матриц, и я пытаюсь использовать политический дизайн. Поэтому мои базовые классы - это классы, которые предоставляют метод хранения, а некоторые функции доступа. У меня также есть функциональная матрица, которая обеспечивает математические функции. Это отлично работает, но есть серьезная проблема с оператором * из-за возвращаемого типа. Я объясню это с помощью некоторого кода.
Базовый класс, обеспечивающий хранилище стека:
template < typename T, unsigned int rows, unsigned int cols>
class denseStackMatrix {
public:
typedef T value_type;
private:
value_type grid[rows][cols];
const unsigned int rowSize;
const unsigned int colSize;
Затем у меня есть свой матричный класс, который обеспечивает математическую функциональность:
template <typename MatrixContainer >
class matrix : public MatrixContainer {
public:
typedef MatrixContainer Mcontainer;
matrix<Mcontainer>& operator +(const matrix<Mcontainer>&);
matrix<Mcontainer>& operator *(const matrix<Mcontainer>&);
operator+
всегда работает, operator*
работает только для квадратной матрицы.
Поэтому нам все еще нужен один для всех матриц. И это было
неправильно. Я уже много пробовал, но ничего не работает.
Я ищу что-то подобное, с помощью С++ 0x (использование
С++ 0x не является обязательным требованием)
вы заметите "???":)
friend auto operator * (const matrix<T1>& matrix1, const matrix<T2>& matrix2)
-> decltype(matrix<???>);
Пример проблемы
matrix<denseStackMatrix<int,3,2> > matrix1;
matrix<denseStackMatrix<int,2,4> > matrix2;
matrix<denseStackMatrix<int,3,4> > matrix3 = matrix1 * matrix2;
Здесь он будет жаловаться на тип, потому что он не соответствует ни одному из двух типов параметров. Но компилятор должен знать тип во время компиляции, и я не знаю, как его предоставить.
Я знаю, что есть другие варианты дизайна, но я действительно ищу решение для этого сценария.
Спасибо!