请考虑以下结构:
template<typename R, unsigned short nCols, unsigned short nRows>
struct Matrix{
std::array<std::array<R, nRows>, nCols> data;
Matrix<R, nCols, nRows>(){
}
}
现在,我想实现乘法功能,但这可能会改变类型。例如,我可以有一个整数矩阵,然后将其乘以浮点数。那么,新矩阵当然将是float类型。我将如何实施呢?这不起作用:
template<typename S>
Matrix<R*S, nRows, nCols> mul(const S& s){
Matrix<R*S, nRows, nCols> result;
for( unsigned short i = 0; i < nCols; ++i ){
for( unsigned short j = 0; j < nRows; ++j ){
result = data[i][j] * s;
}
}
return result;
}
MWE:
template<typename R, unsigned short nCols, unsigned short nRows>
struct Matrix{
std::array<std::array<R, nRows>, nCols> data;
Matrix<R, nCols, nRows>(){
}
template<typename S>
Matrix<R*S, nRows, nCols> mul(const S& s){
Matrix<R*S, nRows, nCols> result;
for( unsigned short i = 0; i < nCols; ++i ){
for( unsigned short j = 0; j < nRows; ++j ){
result = data[i][j] * s;
}
}
return result;
}
}
int main(){
Matrix A<int, 2, 2> A;
A.data[0][0] = 1;
A.data[0][1] = 2;
A.data[1][0] = 3;
A.data[1][1] = 4;
A.mul(3.141f);
return 1;
}
答案 0 :(得分:4)
您需要使用decltype
。
一个可能的选择是:
decltype(std::declval<R>() * std::declval<S>())
为简便起见,可以将std::declval<R>()
替换为data[0][0]
。
如果您使用尾随返回类型:s.data[0][0]
,第二个操作数也可以替换为auto mul(const S& s) -> decltype(...)
。
或者,由于R
和S
可能是默认可构造的,因此您可以逃脱
decltype(R{} * S{})