C++中是否可以重载abs()?

Luc*_*i0o 2 c++ overloading

我正在编写一个库来处理二维矩阵代数,使用矩阵内数据类型的模板,以便拥有最大的自由度并基本上处理我想要的任何类型数据的矩阵。

我想知道是否有某种方法可以重载该abs() 函数,以便将矩阵的行列式写为abs(M);,或者我是否必须使用另一个名称。我唯一关心的是矩阵的行列式与其绝对值相关(如标准符号所示),因此在我看来,重载绝对值函数以返回行列式是有意义的。

我已经尝试将其设为类方法,并使用 来调用它m.abs();,显然这工作得很好......但我希望函数位于类之外,并获取矩阵作为参数,就像函数一样int abs(int n); 。因此,我尝试重载该函数,但这给了我一些问题,因为该abs(n);函数需要一些整数或长整型值作为参数,当然不是用户定义的矩阵。我也尝试将其设为班级的友元方法,但似乎没有帮助。期待您的建议。

Hom*_*512 9

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)