运算符重载 c++ (x==y==z)

Posted

技术标签:

【中文标题】运算符重载 c++ (x==y==z)【英文标题】:operator overloading c++ (x==y==z) 【发布时间】:2014-12-06 16:55:06 【问题描述】:

我遇到了一个奇怪的问题,我不知道如何在重载中解决。 我也尝试过重载运算符 == 。 简单的例子是:

class bla
public:
int a;
void bla(int a):a(a)//costructor
bool operator==(const bla& ob)
     return (a==ob.a);//chk if equal
;
void main()
bla A,B;  
if (A==B)
   flag=1;//just an example...

这很简单,效果很好,我正在尝试处理以下情况:

   if (A==B==C==D)

所以我需要返回类型对象,现在输入 bool。 我试图添加另一个功能:

bla &bla:: operator==(const bool answer)//as a member function
if (answer)
    return *this;

但它似乎没有帮助。有什么建议吗? 谢谢大家

【问题讨论】:

如果您真的必须拥有此功能(我对此提出质疑),那么您可以让运算符返回一个代理类型,该类型既可用于布尔上下文,也可用于进一步比较。 为什么?更改 C++ 的预期语法规则对您有什么好处? 搞笑,class bla 没有字段x!!! 嗨,@StavSer。如果这确实是一项作业,并且您被要求支持A==B==C==D 语法,则强烈暗示您尚未分享有关此作业的一些关键细节。或者分配这个的人已经疯了。 请注意,您正在更改(或试图更改)C++ 的现有语法。如果您执行 int a、b、c 并执行 if (a == b == c),它将比较 a == b,然后将 c 与结果进行比较,在 99.9% 的情况下,这不是您想要的。所以看到上面代码的人肯定会很困惑,除非到处都说得很清楚就是这样用的…… 【参考方案1】:

这是一个可怕的想法,你不应该这样做。

这是你的做法。

#include <type_traits>

template<typename T, typename U>
struct decay_equiv
  : std::is_same<
    typename std::decay<T>::type,
    typename std::decay<U>::type
  >::type ;

template<typename T>
struct comparator 
  bool res;
  T passalong;
  explicit operator bool()  return res; 
  typename std::enable_if<
    !decay_equiv<T, comparator<T> >::value,
    comparator<T>
  >::type operator==(T const& rhs);
  comparator<T> operator==(comparator<T> const& rhs);
;

template<typename T>
typename std::enable_if<
  !decay_equiv<T, comparator<T>>::value,
  comparator<T>
>::type comparator<T>::operator==(T const& rhs) 
  if (!res) 
    return res, rhs;
  
  return (passalong == rhs).res, rhs;


template<typename T>
comparator<T> comparator<T>::operator==(comparator<T> const& rhs) 
  if (!res || !rhs.res) 
    return res, rhs;
  
  return (passalong == rhs.passalong).res, rhs.passalong;


struct bla 
  int a;
  comparator<bla> operator==(bla const& rhs);
  comparator<bla> operator==(comparator<bla> const& rhs);
;

comparator<bla> bla::operator==(bla const& rhs) 
  return a == rhs.a, rhs;


comparator<bla> bla::operator==(comparator<bla> const& rhs) 
  if (!rhs.res) 
    return rhs;
  
  return a == rhs.passalong.a, rhs.passalong;


int main() 
  bla a = 0,b = 0,d = 0;
  if (a==b==d)
    return 0;
  return -1;

此代码假定为 C++11,但只需非常小的更改即可用 C++98 编写。

【讨论】:

谢谢分配,我不知道如何使用模板,但我会查一下。【参考方案2】:

我设法找到了一种不同的方法,它似乎效果很好。 谢谢大家的帮助和建议。

class bla
public:
int a;
bool f;
void bla(int a):a(a)f = true;//costructor
operator bool()return f;
bla& operator==(const bla &ob)//chk if equal
    if (f)
       f=(a==ob.a);
     return *this;

;
void main()
bla A(4),B(4),C(4),D(4);  
if (A==B==C==D)
   flag=1;//just an example...

【讨论】:

在这种情况下,您可能希望将f 设为私人成员。如果您连续进行两次比较,您的代码也会中断,第一次比较失败。 例如:bla A(1), B(2), C(1); if (A==B==C) int flag = 1; B.a=1; if (A==B==C) int flag=1; 将错误地导致第二次比较失败。

以上是关于运算符重载 c++ (x==y==z)的主要内容,如果未能解决你的问题,请参考以下文章

c++重载运算符梳理

等式运算符重载:Is (x!=y) == (!(x==y))?

C++ 中的一元运算符重载类型(新手)

ruby 运算符重载问题

C++中重载加减乘除等运算符的纯虚函数中的返回类型怎么定义??运算符中参数怎么写??

C++ 数组重载运算符 []