如果我有类似数据库的类,我想做这样的事情:
object [1] == otherObject;
如何“双重超载”operator []和operator ==?
答案 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
的对象进行比较。