0

特定の型のインスタンスを相互に比較できるように、一連のクラスを作成する必要があります。

各クラスに固有の比較メソッドを作成し、次のコードを各クラス定義に追加して、 T を現在のクラスの名前に置き換えることを考えました。

bool operator== (const T& L, const T& R)        {return L.compare(R)==0;}
bool operator!= (const T& L, const T& R)      {return L.compare(R)!=0;}
bool operator< (const T& L, const T& R)       {return L.compare(R)<0;}
bool operator<= (const T& L, const T& R)        {return L.compare(R)<=0;}
bool operator> (const T& L, const T& R)       {return L.compare(R)>0;}
bool operator>= (const T& L, const T& R)      {return L.compare(R)>=0;}

ただし、これは一種の繰り返しです。それを行うより一般的な方法はありますか?そのためのマクロを作成して、T でパラメーター化することもできると思いますが、マクロは今ではあまり cplusplusy ではありませんね。継承とポリモーフィズムについても考えましたが、それについて読んだところ (私はまだ仮想クラスを使用していません。C++ は初めてです)、不必要なランタイム オーバーヘッドを導入しているように思えます。 m は、基本クラス ポインターを介して均一にアクセスする必要はありません。マクロやコピー&ペースト以外に、それを達成するためのより良い方法はありますか?

4

3 に答える 3

1

Boost.Operators

ヘッダー<boost/operators.hpp>は、(名前空間内の) クラス テンプレートのセットをいくつか提供しますboost。これらのテンプレートは、クラスによって提供される基本的な演算子の最小数に関して、名前空間スコープで演算子を定義します。

#include <boost/operators.hpp>
#include <cassert>

struct Integer : boost::totally_ordered<Integer>
{
    int value;
    Integer(int x) : value(x) {}
};

bool operator<(Integer lhs,Integer rhs)
{
    return lhs.value < rhs.value;
}
bool operator==(Integer lhs,Integer rhs)
{
    return lhs.value == rhs.value;
}

int main()
{
    Integer a(1), b(2), c(1);
    // We have defined only operator< and operator==
    assert(a < b);
    assert(a == c);
    // Other operators are provided automaticly:
    assert(a <= b);
    assert(b > a);
    assert(b >= a);
    assert(a != b);
}
于 2013-04-20T22:51:32.327 に答える