こんくらいスラスラ出てくるようにしたい。

#include <iostream>
#include <vector>

class CPoint
{
public:
  CPoint(double Distance) : m_Distance(Distance)
  {
  };

  double m_Distance;
};

class CMaxGetter
{
public:
  CPoint* operator()(CPoint* lhs, CPoint* rhs) const
  {
    return (lhs->m_Distance < rhs->m_Distance) ? rhs : lhs;
  };
};

class CMinGetter
{
public:
  CPoint* operator()(CPoint* lhs, CPoint* rhs) const
  {
    return (lhs->m_Distance > rhs->m_Distance) ? rhs : lhs;
  };
};

template<class T>
class CPointerContainer : public std::vector<T*>
{
public:
  virtual ~CPointerContainer()
  {
    for(size_t i = 0; i < this->size(); ++i)
    {
      delete (*this)[i];
    }
  };

  template<class Pred>
  T* GetPoint(Pred& pred)
  {
    if(this->empty())
    {
      return NULL;
    }

    CPointerContainer::iterator it = this->begin();
    CPointerContainer::iterator it_end = this->end();
    T* Ptr = (*it);
    for(++it; it != it_end; ++it)
    {
      Ptr = pred(Ptr, *it);
    }
    return Ptr;
  };
};


int main()
{
  CPointerContainer<CPoint> vec;
  for(size_t i = 0; i < 10; ++i)
  {
    vec.push_back(new CPoint(i));
  }

  CPoint* pMax = vec.GetPoint(CMaxGetter());
  CPoint* pMin = vec.GetPoint(CMinGetter());
  std::cout << "Max : " << pMax->m_Distance << std::endl;
  std::cout << "Min : " << pMin->m_Distance << std::endl;

  return 0;
};