2016-12-06 4 views
1

Позвольте мне определить класс матрицы следующим образомли возможно умножение матриц с аргументами шаблона

template<typename T, size_t rowSize, size_t colSize> 
class Matrix 
{ 
//Class implementation 
}; 

Теперь, если я уже 2 матрицы определяется как

Matrix<double,3,2> A; 
Matrix<double,2,5> B; 
A*B; 

Может умножение быть сделано, если я попробуйте, он сказал бы, что никакие аргументы не могут принимать rhs как double, 2,5 для *. Можно ли обобщить шаблон, чтобы умножить «double, x, y» и «double, y, z» и вернуть новую матрицу «double, x, y»

+0

перегрузки символ *. Ваш прототип функции что-то вроде: Матричный оператор * (Матрица A, Матрица B) –

+0

извините, но я не знаю, как перегружать различные параметры, это что-то вроде шаблона Матрица & operator * (const Матрица & obj) – user3345850

ответ

5
template<typename T, size_t rowSize, size_t colSize> 
class Matrix 
{ 
    // Implementation 
}; 

template< 
    typename T, 
    typename U, 
    size_t rowSize1, 
    size_t commonSize, 
    size_t colSize2 
> 
auto operator * (Matrix<T, rowSize1,commonSize> const & a, 
       Matrix<U, commonSize,colSize2> const & b) 
    -> Matrix<decltype(std::declval<T>()*std::declval<U>()), rowSize1, colSize2> 
{ 
    // Implementation 
} 

int main() 
{ 
    Matrix<double,3,2> A; 
    Matrix<double,2,5> B; 
    auto C = A*B; 
} 

Или как член:

template<typename T, size_t rowSize, size_t colSize> 
class Matrix 
{ 
public: 
    template<typename U, size_t colSize2> 
    auto operator * (Matrix<U, colSize,colSize2> const & b) 
     -> Matrix<decltype(std::declval<T>()*std::declval<U>()), rowSize, colSize2> 
    { 
     // Implementation 
    } 

}; 
+0

Спасибо много, я пробовал это в классе матрицы, у которого уже есть шаблон . Разве это невозможно сделать так? – user3345850

+1

@ пользователь3345850 Конечно. Это будет нечто вроде 'template автооператор * (Matrix const & other) {...}'. Это заявление выглядит немного неудобным, хотя из-за использования 'colSize'' '' '' '' '' '' '' '' '' '' '' '. –

+0

@ user3345850 см. Отредактированный ответ. –

-1

Возможно перезаписать оператор * в пределах класс. Но тогда было бы вообще

T& T::operator*(T otherMatrix); 
    { 
     //do multiplication by hand and return a new Matrix 
    } 

и не принимая только double, как только тип.

+0

ну, извините, но я не спрашиваю о функции перегрузки – user3345850

+0

, если вы попросили проверить тип, возможно, вы могли бы использовать функцию 'typeid()': – daKenpachi

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