あなたの例の慣用的な同等物については、次のように定義operator==
します。
friend bool operator==(const ViewMode &lhs, const ViewMode &rhs) {
return (lhs.w == rhs.w) && the rest;
}
friend bool operator!=(const ViewMode &lhs, const ViewMode &rhs) {
return !(lhs == rhs);
}
C++ では、通常、ViewMode
オブジェクトとまったく関係のないものとオブジェクトを比較できるようにする関数を作成しませんViewMode
。コンパイルを拒否するのではなく、その比較で false を返すことが本当に必要な場合は、いくつかのテンプレート演算子を (フリー関数として、クラスの外に) 追加できると思います。
template <typename T>
bool operator==(const ViewMode &, const T&) {
return false;
}
template <typename T>
bool operator==(const T &, const ViewMode&) {
return false;
}
しかし、私は本当にそれをお勧めしません。Java のイディオムは C++ には当てはまりません。C++ ではほとんどの場合、オブジェクトを持つべきではなく、その型がわからないからです。
equals 関数を仮想関数にしたい場合は、equals()
仮想関数を使用するのではなく、仮想関数を作成することをお勧めしますoperator==
。asパラメータを取るように書くので、チェックconst ViewObject &
に相当するものは必要ありません。instanceof
C++ には、まったく未知の型のオブジェクトを取得して、それが指定された型のインスタンスであるかどうかをテストする方法がないためです。
C++ でポリモーフィック equals 関数が必要になることはめったにありませんが、たとえば で使用している場合はstd::unordered_map
、追加のテンプレート パラメータをunordered_map
. 2 つのポインターを取りequals
、どちらか一方を呼び出す等値比較関数と、適切な処理を行うハッシュ関数を指定します。