如何重载 == 运算符来比较犰狳向量?

问题描述

在我的程序中,我使用了很多 arma::uvec,并像这样检查它们之间的相等性

#include <armadillo>
using Vec = typename arma::uvec;
Vec v1({0,0});
Vec v2({0,1});
bool are_equal = arma::all(v1 == v2);

因为我找不到更好的等式运算符 in the Armadillo docs。现在工作得很好,但为了节省一些空间,作为子类化和运算符重载的练习,我想像这样在向量之间直接定义等号:

class Vec : public arma::uvec {
    friend bool operator==(const Collapsed& lhs,const Collapsed& rhs) {
        return arma::all(lhs == rhs);
    }
};

但遗憾的是,我无法让它像那样工作。我很感激任何提示

解决方法

运算符重载不需要是类的一部分。我建议将您的比较运算符实现为这样的免费功能:

<ul id="list1" class="sortable">
    <li>li Item</li>
    <li>li Item</li>
    <li>li Item</li>
    <li>li Item</li>
    <li>li Item</li>
    // many more li elements
</ul>

关于您的问题中的 bool operator==(const arma::uvec& lhs,const arma::uvec& rhs) { return arma::all(lhs == rhs); } :作为一个快速总结,它提供了对朋友声明所在类的私有和受保护成员进行友好访问的功能。它不用于实现功能。 您可以在 cppreferencethis SO question

上阅读更多相关信息

编辑 由于上述仅在 friend 尚未定义时才有效,因此这里有一个覆盖自定义子类实现的版本:

operator==
,

问题在于图书馆本身:

Armadillo: C++ library for linear algebra & scientific computing

运算符:+  −  *  %  /  ==  !=  <=  >=  <  >  &&  ||

  • MatColRowCube 类的重载运算符

  • 操作:
    + 两个对象相加

    从一个对象减去另一个对象或否定一个对象

    * 两个对象的矩阵乘法;不适用于 Cube 类,除非乘以标量

    % 两个对象的逐元素乘法(Schur 乘积)

    / 一个对象被另一个对象或标量按元素划分

    == 两个对象的元素相等评估; 生成umat/ucube

    类型的矩阵/立方体

    != 两个对象的逐元素不相等评估;生成 umat/ucube

    类型的矩阵/立方体

uvec 是:

uvec = ucolvec = Col<uword>

所以 operator== 已经存在,它的功能很奇怪/出乎意料。

我的建议是:不要和图书馆打架。不要尝试提供自己的运营商。只需提供一个命名函数 areEqual

定义一个类只是为了提供自己的相等运算符不是最好的选择,如果这样做,那么 IMO 最好使用组合而不是继承(根据要求,类本身将是更多样板代码,但它将是更容易避免意外行为)。