如何“双重超载”操作员?

时间:2010-07-03 03:46:35

标签: c++ operator-overloading

如果我有类似数据库的类,我想做这样的事情:

object [1] == otherObject;

如何“双重超载”operator []和operator ==?

4 个答案:

答案 0 :(得分:8)

object[1]返回someType的对象。您需要在operator==上重载someType

答案 1 :(得分:2)

您描述的只是两个独立的运算符重载。只需确保operator ==的参数与operator []的返回类型匹配。

答案 2 :(得分:2)

我最初对这个问题的措辞感到困惑,但现在我觉得我明白了。你不能直接这样做;但你可以达到同样的效果。我们的想法是让operator[]返回代理对象。对于代理对象,您可以为operator==提供自定义行为以进行比较。我已经看到std :: map的operator []在一些较旧的,更模糊的标准库实现上以这种方式实现。

示例(假设对象[1]通常返回Foo&):

class SomeProxy
{
private:
    Foo* f;
public:
    explicit SomeProxy(Foo& i_f): f(&i_f) {}
    operator Foo&() const {return *f;}
};

SomeProxy Database::operator[](unsigned int n)
{
     return SomeProxy(some_array + n);
}

bool operator==(const SomeProxy& lhs, const Foo& rhs)
{
    // provide custom behavior
}


// also provide custom behavior for these:
bool operator==(const SomeProxy& lhs, const SomeProxy& rhs);
bool operator==(const Foo& lhs, const SomeProxy& rhs);

注意:在这种情况下,您希望重载比较运算符的含义似乎有些奇怪(代理对象通常用于具有关联结构或花式metatemplate编程的自定义赋值行为)但为了进行比较,它们通常应该提供与直接使用Foo相同的含义,例如不过,这是实现此目的的方法:通过operator==获取自定义行为的方法,仅适用于在同一表达式中使用重载operator[]的情况。

如果你想彻底解决这个问题,那么将SomeProxy的构造函数设为私有,并使数据库成为朋友。这样,只有Database:可以创建那些对象(在这种情况下通过operator []),客户端将无法复制它(他不应该),只能从中获取Foo对象/引用或者使用表达式中返回的代理。

答案 3 :(得分:1)

不要将运算符重载视为特殊的,它们就像正常的函数重载一样。具有相同名称的两个函数可以重载,因为它们具有不同的签名。 (顺便说一句,你不能仅仅通过返回类型重载2个函数。这不仅仅适用于运算符重载,而是一般的所有函数重载。)

就像这样:

class B {};
class C {};
class A
{
  bool operator==(const B& b)
  {
      //Put logic here
      return true;
  }

  bool operator==(const C& c)
  {
      //Put logic here
      return true;
  }

};

上面的代码允许您将类型为A的对象与类型为B的对象进行比较。它还允许您将类型为A的对象与类型为C的对象进行比较。