C++ 如何使模板函数(运算符)隐式推导模板参数?

C++ 如何使模板函数(运算符)隐式推导模板参数?,c++,templates,operators,template-argument-deduction,C++,Templates,Operators,Template Argument Deduction,我需要编译以下代码: 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; // C

我需要编译以下代码:

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;
MatrixBase类只是一个派生Matrix的非模板抽象类,试图使
运算符*
泛型。 问题是
lhs
rhs
尚未初始化,并且它没有编译,我曾想过将
运算符*
作为矩阵的一种方法,但我仍然坚持使用返回类型。
我知道这个模板是由预处理器决定的,但我确信有办法让它运行。

你的问题缺少一些关于什么是
MatrixBase
的信息,但是如果我们只看一下你的
Matrix
类,你需要一个模板函数来实现这一点。在那里,您可以推断类的模板参数,并使用这些参数来计算结果类型

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;
}
模板
矩阵运算符*(常数矩阵和lhs、常数矩阵和rhs){
静态断言(LCols==RRows,“无效矩阵乘法”);
矩阵结果;
//…进行计算
返回结果;
}

您的问题缺少有关
矩阵库
是什么的一些信息,但如果我们只看一下您的
矩阵
类,您需要一个模板函数来完成此操作。在那里,您可以推断类的模板参数,并使用这些参数来计算结果类型

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;
}
模板
矩阵运算符*(常数矩阵和lhs、常数矩阵和rhs){
静态断言(LCols==RRows,“无效矩阵乘法”);
矩阵结果;
//…进行计算
返回结果;
}

你不能那样做。C++不这样工作。所有模板参数必须是编译时
constexpr
s。您需要以某种方式重新设计代码。也许在
矩阵
模板本身中实现
操作符*
,而不是一个名为
MatrixBase
的神秘超类。你不能这样做。C++不这样工作。所有模板参数必须是编译时
constexpr
s。您需要以某种方式重新设计代码。也许在
矩阵
模板本身中实现
操作符*
,而不是一个名为
MatrixBase
的神秘超类。MatrixBase它只是所有矩阵派生的类,我这样做是为了尝试接受每种大小的lhs和rhs,但你的解决方案很漂亮,像魔术一样工作,您能解释一下编译器是如何从lhs/rhs模板参数创建正确的“运算符*”的吗?它用来在编译时推断传入参数的类型。然后,这些信息可以用作编译时常量来执行某些操作,例如在本例中,计算结果矩阵的大小。因此,每次使用不同的参数调用函数时,编译器都会将其用作原型,并为这些特定类型生成一个新函数。这意味着每个单独的安装可以有不同的返回类型,这取决于传入的参数的类型。MatrixBase它只是所有Matrix派生的类,我这样做是为了尝试接受每个大小的lhs和rhs,但您的解决方案很漂亮,工作起来很神奇,您能解释一下编译器是如何从lhs/rhs模板参数创建正确的“运算符*”的吗?它用来在编译时推断传入参数的类型。然后,这些信息可以用作编译时常量来执行某些操作,例如在本例中,计算结果矩阵的大小。因此,每次使用不同的参数调用函数时,编译器都会将其用作原型,并为这些特定类型生成一个新函数。这意味着每个单独的安装可以有不同的返回类型,这取决于传入的参数的类型。