0

オブジェクトを使用して並べ替えられるように、次のコードを変更したいと思います。単一の値を返す個々のメソッドをソートする場合、現在のコードで問題ありません。オブジェクトを返すメソッドを使用して実装するにはどうすればよいですか。

template<typename T, typename M, template<typename> class C = std::less>
struct method_comparer : std::binary_function<T, T, bool>
{
explicit method_comparer(M (T::*p)() const) : p_(p) { }

bool operator ()(T const& lhs, T const& rhs) const
{
return C<M>()((lhs.*p_)(), (rhs.*p_)());
}

private:
M (T::*p_)() const;
};



template<typename T, typename M>
method_comparer<T, M> make_method_comparer(M (T::*p)() const)
{
return method_comparer<T, M>(p);
}

template<template<typename> class C, typename T, typename M>
method_comparer<T, M, C> make_method_comparer2(M (T::*p)() const)
{
 return method_comparer<T, M, C>(p);
 }

Main.cpp

// works well
std::sort(vec_p2d.begin(),vec_p2d.end(),make_method_comparer(&Point2D::getX)); 

//これを実装したい

 std::sort(vec_l2d.begin(),vec_l2d.end(),make_method_comparer(&Line2D::getPt1)); 

getPt1()メソッドは、intxおよびintyの値を含むPoint2Dオブジェクトを返します。

4

2 に答える 2

1

ブーストを使用できる場合は、次のようにします。

std::sort(vec_p2d.begin(), vec_p2d.end(), boost::bind( &Point2D::getX, _1 ) < boost::bind( &Point2D::getX, _2 ) );

std::sort(vec_p2d.begin(), vec_p2d.end(), boost::bind( &Point2D::getPt1, _1 ) < boost::bind( &Point2D::getPt1, _2 ) );

于 2012-11-15T09:51:42.577 に答える
1

AFAICS、コードはそのままにしておくことができます。定義する必要があるのは、Point2D返すオブジェクトの比較演算子またはオブジェクトの比較演算子だけです。

class Point2D {
public:
    friend bool operator<(const Point2D &p1, const Point2D &p2) { ...; }
    ...
};

クラスを削除してmethod_comparer、適切な比較関数を指定して並べ替えることもできます。

bool compare_line_points(const Line2D &l1, const Line2D &l2) {
    return l1.getPt1() < l2.getPt1();
}

std::sort(vec_l2d.begin(), vec_l2d.end(), compare_line_points);

要件に応じて、これらは1つまたは2つのライナーの集まりにすぎません。テンプレートは必要ありません。

于 2012-11-15T10:06:23.357 に答える