我有一个结构,我想通过定义<来定义相对顺序。 ,> ,< =和> =运营商。实际上在我的顺序中不会有任何相等,所以如果一个结构不小于另一个结构,它会自动变大。
我定义了第一个这样的运算符:
struct MyStruct{
...
...
bool operator < (const MyStruct &b) const {return (somefancycomputation);}
};
现在我想根据这个运算符定义其他运算符,这样&lt; =将返回与&lt;而另外两个将简单地返回对面。 例如,对于&gt;我想写一些像
这样的东西bool operator > (const MyStruct &b) const {return !(self<b);}
但我不知道如何引用这个'self',因为我只能引用当前结构中的字段。
整体是在C ++中
希望我的问题可以理解:)
谢谢你的帮助!
答案 0 :(得分:10)
自我为*this
。
也就是说,this
是指向当前对象的指针,因此您需要取消引用它以获取实际对象。
答案 1 :(得分:6)
如果您正在为operator<
提供所有适当的逻辑(无论它是否作为自由函数实现),您可以将其他运算符实现为自由函数。这遵循以下规则:在可能的情况下,非成员优先于成员,而自由职能将具有相同的行为w.r.t.左右操作数的转换,而作为成员函数实现的运算符则不会。
e.g。
inline bool operator>(const MyStruct& a, const MyStruct&b)
{
return b < a;
}
inline bool operator<=(const MyStruct& a, const MyStruct&b)
{
return !(b < a);
}
inline bool operator>=(const MyStruct& a, const MyStruct&b)
{
return !(a < b);
}
答案 2 :(得分:2)
这意味着比Element's answer略有改进:
template< class Derived >
class Comparable {
public:
bool operator !=(const Derived& rhs) const
{return !( static_cast<Derived&>(*this) == rhs ); }
bool operator <(const Derived& rhs) const
{return rhs < static_cast<Derived&>(*this); }
bool operator >=(const Derived& rhs) const
{return !( static_cast<Derived&>(*this) < rhs ); }
bool operator <=(const Derived& rhs) const
{return !( static_cast<Derived&>(*this) > rhs ); }
};
struct MyStruct : public Comparable<MyStruct> {
bool operator ==(const MyStruct & rhs) const
{return /* whatever */; }
bool operator <(const MyStruct & rhs) const
{return /* whatever */; }
};
答案 3 :(得分:1)
重载运算符只是一个成员函数,但具有花哨的语法。 您可以这样明确地调用它:
this->operator<( b );
或保存自己的头发:)并提供int compare( const MyStruct& )
成员函数并在所有非成员比较运算符中使用它。
答案 4 :(得分:1)
这是指向当前对象的指针。所以(正如@Dave Hinton所说)你必须取消引用它。但是,还有另一种选择
两个选项:
return !(*this<b)
or
return (!this->operator<(b))
是的,第一个非常好。
答案 5 :(得分:1)
实际上在我的顺序中不会有任何相等,所以如果一个结构不小于另一个结构,它会自动变大。
这是一个问题。 C ++操作(和许多算法)需要strict weak ordering,其中({等式})意味着x == x
适用于任何x
。更一般地说:
not (x < y) and not (y < x)
意味着
x == y
适用于任何x
和y
。换句话说:你很可能必须为你的结构定义某种相等性,以便与任何传统算法一起使用。
答案 6 :(得分:0)
我和Tom / Dave在一起,直接写这个:
return !(*this<b);
但对我来说,最明确的形式是:
return !operator<(b);
和Tom's:return!(this-&gt; operator&lt;(b));看起来有点傻。
这个有点讨厌的C预处理器代码(我也有一个更好但更技术性的模板解决方案):
#define CREATE_SYMETRIC_ORDINAL_OPERATORS(Type) \
int operator !=(Type X) {return !((*this)==X); } \
int operator <(Type X) {return !((*this)>=X); } \
int operator >=(Type X) {return (((*this)>X)||((*this)==X)); } \
int operator <=(Type X) {return (((*this)<X)||((*this)==X)); }
假设==和&gt; 自动定义所有比较运算符定义如下:
class Comparable {
public:
int operator ==(Comparable B);
int operator >(Comparable B);
CREATE_SYMETRIC_OPERATORS(Comparable);
};