source: liblaziness/lambda_trait.h @ 22

Last change on this file since 22 was 4, checked in by artyom, 13 years ago

liblaziness

File size: 1.7 KB
Line 
1#ifndef __LAMBDA_TRAIT__
2#define __LAMBDA_TRAIT__
3
4template<int i>
5struct lambdatype_args
6{
7        enum { value = i };
8};
9
10struct 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
25template<typename TFun>
26struct 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
32template<typename TFun, int i = lambdatype_base<TFun>::arg_count>
33struct lambdatype;
34
35template<typename TFun>
36struct 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
42template<typename TFun>
43struct 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
50template<typename TFun>
51struct 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
Note: See TracBrowser for help on using the repository browser.