如何使模板函数(运算符)隐式推导模板参数?
how to make template function (operator) deduce template arguments implicitly?
我有这段代码需要编译:
int main () {
const Matrix<int, 3, 2> m1; // Creates 3*2 matrix, with all elements set to 0;
Matrix<int, 3, 3> m2(4); // Creates 3*3 matrix, with all elements equals to 4;
const Matrix<int, 3, 3> m3 = m2; // Copy constructor may take O(MN) and not O(1).
cout << m3 * m1 << endl; // You can choose the format of matrix printing;
我已经为模板矩阵实现了 operator<<
。
问题是实现 operator*
以便使用 m3.rows 和 m1.cols 的模板参数创建一个新矩阵,即正确 return 键入 operator*
的签名结果表达式。
我试过了:
Matrix<int, lhs.rows, rhs.cols> operator *(const MatrixBase& lhs, const MatrixBase& rhs)
Matrix<?> res; // not sure how to define it
{
for (int i = 0; i < lhs.get_columns(); i++)
{
for (int j = 0; j < rhs.get_rows(); j++)
{
for (int k = 0; k < lhs.get_columns(); k++)
{
res[i][j] = lhs[i][k] * rhs [k][j];
}
}
}
}
class MatrixBase 只是一个非模板抽象 class Matrix 派生自,试图使 operator*
通用。
问题是 lhs
和 rhs
还没有初始化,它没有编译,我想把 operator*
作为 Matrix 的方法,但我仍然停留在 return 类型。
我知道模板是由预处理器决定的,但我确信有办法做到这一点 运行.
您的问题缺少有关 MatrixBase
是什么的一些信息,但如果我们只查看您的 Matrix
class,您需要一个模板函数来执行此操作。在那里你可以推断出 classes 的模板参数并使用它来计算结果类型。
template <typename T, int LRows, int LCols, int RRows, int RCols>
Matrix<T, LRows, RCols> operator*(const Matrix<T, LRows, LCols>& lhs, const Matrix<T, RRows, RCols>& rhs) {
static_assert(LCols == RRows, "Invalid matrix multiplication");
Matrix<T, LRows, RCols> result;
// ... do the calculations
return result;
}
我有这段代码需要编译:
int main () {
const Matrix<int, 3, 2> m1; // Creates 3*2 matrix, with all elements set to 0;
Matrix<int, 3, 3> m2(4); // Creates 3*3 matrix, with all elements equals to 4;
const Matrix<int, 3, 3> m3 = m2; // Copy constructor may take O(MN) and not O(1).
cout << m3 * m1 << endl; // You can choose the format of matrix printing;
我已经为模板矩阵实现了 operator<<
。
问题是实现 operator*
以便使用 m3.rows 和 m1.cols 的模板参数创建一个新矩阵,即正确 return 键入 operator*
的签名结果表达式。
我试过了:
Matrix<int, lhs.rows, rhs.cols> operator *(const MatrixBase& lhs, const MatrixBase& rhs)
Matrix<?> res; // not sure how to define it
{
for (int i = 0; i < lhs.get_columns(); i++)
{
for (int j = 0; j < rhs.get_rows(); j++)
{
for (int k = 0; k < lhs.get_columns(); k++)
{
res[i][j] = lhs[i][k] * rhs [k][j];
}
}
}
}
class MatrixBase 只是一个非模板抽象 class Matrix 派生自,试图使 operator*
通用。
问题是 lhs
和 rhs
还没有初始化,它没有编译,我想把 operator*
作为 Matrix 的方法,但我仍然停留在 return 类型。
我知道模板是由预处理器决定的,但我确信有办法做到这一点 运行.
您的问题缺少有关 MatrixBase
是什么的一些信息,但如果我们只查看您的 Matrix
class,您需要一个模板函数来执行此操作。在那里你可以推断出 classes 的模板参数并使用它来计算结果类型。
template <typename T, int LRows, int LCols, int RRows, int RCols>
Matrix<T, LRows, RCols> operator*(const Matrix<T, LRows, LCols>& lhs, const Matrix<T, RRows, RCols>& rhs) {
static_assert(LCols == RRows, "Invalid matrix multiplication");
Matrix<T, LRows, RCols> result;
// ... do the calculations
return result;
}