1 |
#pragma once |
2 |
|
3 |
template<typename C, typename T, T (C::*Member)> |
4 |
struct class_member |
5 |
{ |
6 |
typedef C object_type; |
7 |
typedef T member_type; |
8 |
|
9 |
static member_type const &get (object_type const &v) |
10 |
{ |
11 |
return v.*Member; |
12 |
} |
13 |
}; |
14 |
|
15 |
template<typename C> |
16 |
bool |
17 |
member_cmp (C const &a, C const &b) |
18 |
{ |
19 |
return false; |
20 |
} |
21 |
|
22 |
template<typename Member, typename... Members> |
23 |
bool |
24 |
member_cmp (typename Member::object_type const &a, |
25 |
typename Member::object_type const &b) |
26 |
{ |
27 |
return Member::get (a) != Member::get (b) |
28 |
? Member::get (a) < Member::get (b) |
29 |
: member_cmp<Members...> (a, b) |
30 |
; |
31 |
} |
32 |
|
33 |
#define MEMBER(class, member) class_member<class, decltype (class::member), &class::member> |