struct foo { public: int d; std::string s; }; struct comparator; struct comparator_proxy { comparator const *ptr; public: comparator_proxy(comparator const *ptr) : ptr(ptr) {} bool operator()(foo const &a, foo const &b) const; }; struct comparator { virtual ~comparator() {} virtual bool operator()(foo const &, foo const &) const = 0; comparator_proxy proxy() const { return comparator_proxy(this); } }; bool comparator_proxy::operator()(foo const &a, foo const &b) const { return (*ptr)(a, b); } template<typename T> struct member_comparator : comparator { T foo::*data; explicit member_comparator(T foo::*data) : data(data) {} bool operator()(foo const &a, foo const &b) const { return a.*data < b.*data; } }; template<typename T> std::auto_ptr<comparator> make_member_comparator(T foo::*ptr) { return std::auto_ptr<comparator>(new member_comparator<t>(ptr)); } struct boo { std::vector<foo> arr; void sort_by(int num) { static std::auto_ptr<comparator> member[] = { make_member_comparator(&foo::d), make_member_comparator(&foo::s), }; std::sort(arr.begin(), arr.end(), member[num]->proxy()); } };@from
четверг, 2 июня 2011 г.
OMG, pointer to member
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий