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

时间:2014-12-06 16:55:07

标签: c++ class overloading

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

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;

但它似乎没有帮助。有什么建议吗? thx Stas

2 个答案:

答案 0 :(得分: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编写,只需进行非常小的更改。

答案 1 :(得分:0)

我设法找到了一种不同的方法,它看起来效果很好。 请大家帮忙和建议。

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...