#ifndef __LAMBDA_TRAIT__ #define __LAMBDA_TRAIT__ template struct lambdatype_args { enum { value = i }; }; struct lambdatype_helper { template static auto arg2(R (F::*fun)(Arg1, Arg2, Args...) const) -> Arg2; template static auto arg1(R (F::*fun)(Arg1, Args...) const) -> Arg1; template static auto result(R (F::*fun)(Args...) const) -> R; template static lambdatype_args arg_count(R (F::*fun)(Args...) const); }; template struct lambdatype_base { typedef decltype(lambdatype_helper::result(&TFun::operator())) return_type; enum { arg_count = decltype(lambdatype_helper::arg_count(&TFun::operator()))::value }; }; template::arg_count> struct lambdatype; template struct lambdatype { typedef typename lambdatype_base::return_type return_type; enum { arg_count = lambdatype_base::arg_count }; }; template struct lambdatype { typedef typename lambdatype_base::return_type return_type; enum { arg_count = lambdatype_base::arg_count }; typedef decltype(lambdatype_helper::arg1(&TFun::operator())) arg1_type; }; template struct lambdatype { typedef typename lambdatype_base::return_type return_type; enum { arg_count = lambdatype_base::arg_count }; typedef decltype(lambdatype_helper::arg1(&TFun::operator())) arg1_type; typedef decltype(lambdatype_helper::arg2(&TFun::operator())) arg2_type; }; #endif