1 | #ifndef __LAMBDA_TRAIT__ |
---|
2 | #define __LAMBDA_TRAIT__ |
---|
3 | |
---|
4 | template<int i> |
---|
5 | struct lambdatype_args |
---|
6 | { |
---|
7 | enum { value = i }; |
---|
8 | }; |
---|
9 | |
---|
10 | struct lambdatype_helper |
---|
11 | { |
---|
12 | template<typename F, typename R, typename Arg1, typename Arg2, typename... Args> |
---|
13 | static auto arg2(R (F::*fun)(Arg1, Arg2, Args...) const) -> Arg2; |
---|
14 | |
---|
15 | template<typename F, typename R, typename Arg1, typename... Args> |
---|
16 | static auto arg1(R (F::*fun)(Arg1, Args...) const) -> Arg1; |
---|
17 | |
---|
18 | template<typename F, typename R, typename... Args> |
---|
19 | static auto result(R (F::*fun)(Args...) const) -> R; |
---|
20 | |
---|
21 | template<typename F, typename R, typename... Args> |
---|
22 | static lambdatype_args<sizeof...(Args)> arg_count(R (F::*fun)(Args...) const); |
---|
23 | }; |
---|
24 | |
---|
25 | template<typename TFun> |
---|
26 | struct lambdatype_base |
---|
27 | { |
---|
28 | typedef decltype(lambdatype_helper::result(&TFun::operator())) return_type; |
---|
29 | enum { arg_count = decltype(lambdatype_helper::arg_count(&TFun::operator()))::value }; |
---|
30 | }; |
---|
31 | |
---|
32 | template<typename TFun, int i = lambdatype_base<TFun>::arg_count> |
---|
33 | struct lambdatype; |
---|
34 | |
---|
35 | template<typename TFun> |
---|
36 | struct lambdatype<TFun, 0> |
---|
37 | { |
---|
38 | typedef typename lambdatype_base<TFun>::return_type return_type; |
---|
39 | enum { arg_count = lambdatype_base<TFun>::arg_count }; |
---|
40 | }; |
---|
41 | |
---|
42 | template<typename TFun> |
---|
43 | struct lambdatype<TFun, 1> |
---|
44 | { |
---|
45 | typedef typename lambdatype_base<TFun>::return_type return_type; |
---|
46 | enum { arg_count = lambdatype_base<TFun>::arg_count }; |
---|
47 | typedef decltype(lambdatype_helper::arg1(&TFun::operator())) arg1_type; |
---|
48 | }; |
---|
49 | |
---|
50 | template<typename TFun> |
---|
51 | struct lambdatype<TFun, 2> |
---|
52 | { |
---|
53 | typedef typename lambdatype_base<TFun>::return_type return_type; |
---|
54 | enum { arg_count = lambdatype_base<TFun>::arg_count }; |
---|
55 | typedef decltype(lambdatype_helper::arg1(&TFun::operator())) arg1_type; |
---|
56 | typedef decltype(lambdatype_helper::arg2(&TFun::operator())) arg2_type; |
---|
57 | }; |
---|
58 | |
---|
59 | #endif |
---|