2017-11-02 13 views
-3

リレーショナル演算子(==、>、<、> =、< =)をオーバーロードしようとしていますが、エラーを返すのではなく、2つのオブジェクトが異なる場合はfalseを返すことができます。たとえば、ArrayListクラスと現在比較できないVectorクラスがあります。どうすればこれを達成できますか?C++ 2つのオブジェクトが同じかどうかを確認するためにリレーショナル演算子をオーバーロードするにはどうすればよいですか?

+0

オブジェクトが異なる場合、 '=='は 'false'を返すのが普通です。それらのオブジェクトが「エラーを返す」(それが意味するものはすべて)では正常ではありません。あなたはあなたがどんな問題を抱えているかを精緻化できますか? –

+1

オペレータのオーバーロードの基本ルールとイディオムは何ですか?(https://stackoverflow.com/questions/4421706/what-are-the-basic-rules-and-idioms-for-operator-overloading) – user0042

+0

彼は、さまざまな型のオブジェクトを比較できるようにしたいと考えています。これは、しばしば実装されている(コンパイル時にエラーが発生する)ものではありません。 –

答えて

1

多分何か試してみてください:

#include <iostream> 

class ArrayList {}; 
class Vector {}; 

bool operator==(Vector const &v, ArrayList const &al) { return false; } 
bool operator==(ArrayList const &al, Vector const &v) { return false; } 

int main() 
{ 
    ArrayList al; 
    Vector v; 

    std::cout << (al == v ? "true" : "false") << std::endl; 
    std::cout << (v == al ? "true" : "false") << std::endl; 

    return 0; 

} 

両方の比較はfalseを出力します。テンプレートを使用して

EDIT:

#include <iostream> 
#include <type_traits> 

class ArrayList {}; 
class Vector {}; 
class Whatever {}; 

template <class T, class U> bool operator==(T const &, U const &) 
{ 
    return std::is_same<T, U>::value; 
} 


int main() 
{ 

    ArrayList al; 
    Vector v; 
    Whatever w; 

    std::cout << (al == v ? "true" : "false") << std::endl; 
    std::cout << (v == al ? "true" : "false") << std::endl; 
    std::cout << (w == v ? "true" : "false") << std::endl; 
    std::cout << (w == w ? "true" : "false") << std::endl; 

    return 0; 

} 

クラスがない場合は、同じまたは偽である場合、これは単にtrueを返します。

+0

ええ、その特定のケースでは、正直に言うと、これは複数のクラスを含む課題の質問ですが、デモでは2つが比較されます。だから私はこれを行う必要があるすべての重要な理由は本当にありませんが、私はすべてのクラスのためにそれが可能かどうか疑問に思っていた。 –

+0

あなたはテンプレートが好きかもしれませんが、私は簡単な例を追加しました –

関連する問題