#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct MyType {
int a, b;
};
template<class T, class U>
class CompareByMember {
U (T::*mem); // ugly syntax for member pointer of type U in class T
public:
CompareByMember(U (T::*mem)) : mem(mem) {}
bool operator()(const T &a, const T &b) {
return (a.*mem) < (b.*mem); // ugly syntax for member pointer access
}
};
template<class T, class U>
CompareByMember<T,U> compareByMember(U (T::*mem)) {
return CompareByMember<T,U>(mem);
}
void print(std::vector<MyType> v) {
for (MyType t : v)
cout << t.a << ", " << t.b << endl;
}
int main() {
std::vector<MyType> v = {{1, 2}, {0, 3}, {2, 0}, {4, 1}, {3, 4}};
std::cout << "Sort by `a`:" << endl;
std::sort(v.begin(), v.end(), compareByMember(&MyType::a));
print(v);
std::cout << "Sort by `b`:" << endl;
std::sort(v.begin(), v.end(), compareByMember(&MyType::b));
print(v);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IE15VHlwZSB7CglpbnQgYSwgYjsKfTsKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CmNsYXNzIENvbXBhcmVCeU1lbWJlciB7CiAgICBVIChUOjoqbWVtKTsgICAgICAgICAgLy8gdWdseSBzeW50YXggZm9yIG1lbWJlciBwb2ludGVyIG9mIHR5cGUgVSBpbiBjbGFzcyBUCnB1YmxpYzoKICAgIENvbXBhcmVCeU1lbWJlcihVIChUOjoqbWVtKSkgOiBtZW0obWVtKSB7fQogICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsKICAgICAgICByZXR1cm4gKGEuKm1lbSkgPCAoYi4qbWVtKTsgICAgIC8vIHVnbHkgc3ludGF4IGZvciBtZW1iZXIgcG9pbnRlciBhY2Nlc3MKICAgIH0KfTsKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CkNvbXBhcmVCeU1lbWJlcjxULFU+IGNvbXBhcmVCeU1lbWJlcihVIChUOjoqbWVtKSkgewogICAgcmV0dXJuIENvbXBhcmVCeU1lbWJlcjxULFU+KG1lbSk7Cn0KCnZvaWQgcHJpbnQoc3RkOjp2ZWN0b3I8TXlUeXBlPiB2KSB7Cglmb3IgKE15VHlwZSB0IDogdikKCQljb3V0IDw8IHQuYSA8PCAiLCAiIDw8IHQuYiA8PCBlbmRsOwp9CgppbnQgbWFpbigpIHsKCXN0ZDo6dmVjdG9yPE15VHlwZT4gdiA9IHt7MSwgMn0sIHswLCAzfSwgezIsIDB9LCB7NCwgMX0sIHszLCA0fX07CgkKCXN0ZDo6Y291dCA8PCAiU29ydCBieSBgYWA6IiA8PCBlbmRsOwoJc3RkOjpzb3J0KHYuYmVnaW4oKSwgdi5lbmQoKSwgY29tcGFyZUJ5TWVtYmVyKCZNeVR5cGU6OmEpKTsKCXByaW50KHYpOwoJCglzdGQ6OmNvdXQgPDwgIlNvcnQgYnkgYGJgOiIgPDwgZW5kbDsKCXN0ZDo6c29ydCh2LmJlZ2luKCksIHYuZW5kKCksIGNvbXBhcmVCeU1lbWJlcigmTXlUeXBlOjpiKSk7CglwcmludCh2KTsKCQoJcmV0dXJuIDA7Cn0=
Sort by `a`:
0, 3
1, 2
2, 0
3, 4
4, 1
Sort by `b`:
2, 0
4, 1
1, 2
0, 3
3, 4