获取两个不同模板的产品类型

时间:2019-10-20 16:32:53

标签: c++ templates c++17

请考虑以下结构:

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;
}

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(...)


或者,由于RS可能是默认可构造的,因此您可以逃脱

decltype(R{} * S{})