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模板参数创建正确的“运算符*”的吗?它用来在编译时推断传入参数的类型。然后,这些信息可以用作编译时常量来执行某些操作,例如在本例中,计算结果矩阵的大小。因此,每次使用不同的参数调用函数时,编译器都会将其用作原型,并为这些特定类型生成一个新函数。这意味着每个单独的安装可以有不同的返回类型,这取决于传入的参数的类型。