1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
struct A {
int a;
float b;
std::string c;
friend std::ostream & operator<<(std::ostream & os, const A & v)
{
return os << "{" << v.a << ", " << v.b << ", " << v.c << "}";
}
};
template <class T, class V> struct sort_by_impl {
sort_by_impl(V T::*p) : m_p(p) {}
bool operator()(T const& lhs, T const& rhs) const
{ return lhs.*m_p < rhs.*m_p; }
private:
V T::*m_p;
};
template <class T, class V> sort_by_impl<T,V> sort_by(V T::*p) { return sort_by_impl<T,V>(p); }
int main ()
{
std::vector<A> a{
{1, 12.5, "z"},
{2, 2.5, "b"},
{3, 42.5, "a"}
};
std::copy(a.begin(),a.end(), std::ostream_iterator<A>(std::cout, "\n"));
std::cout << "a\n";
std::sort(a.begin(),a.end(), sort_by(&A::a));
std::copy(a.begin(),a.end(), std::ostream_iterator<A>(std::cout, "\n"));
std::cout << "b\n";
std::sort(a.begin(),a.end(), sort_by(&A::b));
std::copy(a.begin(),a.end(), std::ostream_iterator<A>(std::cout, "\n"));
std::cout << "c\n";
std::sort(a.begin(),a.end(), sort_by(&A::c));
std::copy(a.begin(),a.end(), std::ostream_iterator<A>(std::cout, "\n"));
}
// Vim: let $CXXFLAGS='-std=c++0x' |
Partager