我正在编写一个库来处理二维矩阵代数,使用矩阵内数据类型的模板,以便拥有最大的自由度并基本上处理我想要的任何类型数据的矩阵。
我想知道是否有某种方法可以重载该abs() 函数,以便将矩阵的行列式写为abs(M);,或者我是否必须使用另一个名称。我唯一关心的是矩阵的行列式与其绝对值相关(如标准符号所示),因此在我看来,重载绝对值函数以返回行列式是有意义的。
我已经尝试将其设为类方法,并使用 来调用它m.abs();,显然这工作得很好......但我希望函数位于类之外,并获取矩阵作为参数,就像函数一样int abs(int n); 。因此,我尝试重载该函数,但这给了我一些问题,因为该abs(n);函数需要一些整数或长整型值作为参数,当然不是用户定义的矩阵。我也尝试将其设为班级的友元方法,但似乎没有帮助。期待您的建议。
C++ 有一个称为参数相关查找的功能,专为此类需要在独立函数之间重载的情况而设计。典型的应用是重载,std::swap但您也可以在这里使用它。
#include <cmath>
// using std::abs
#include <iostream>
namespace my_ns {
class Matrix
{};
float abs(const Matrix&)
{
std::cout << "Calling abs(Matrix)\n";
return 0.f;
}
} /* namespace my_ns */
int main()
{
my_ns::Matrix mat;
std::cout << abs(mat) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
输出:
Calling abs(Matrix)
0
Run Code Online (Sandbox Code Playgroud)
关键是你在调用时没有指定命名空间abs。如果你调用std::abs(mat)它就会失败。然而,如果你写的话它仍然有效using std::abs。这对于模板很有用,这样您就可以使用std::abs标准类型,也可以abs在您自己的命名空间中使用您自己的类型。
Calling abs(Matrix)
0
Run Code Online (Sandbox Code Playgroud)