废话不多说,上来贴代码最实在,哈哈!

以下代码量有点多,不过这都是在下一手一手敲出来的,小巧好用,把以下代码复制出来,放到相应的hpp文件即可,VS,GCC下均能编译通过

 #include<iostream>
#include "../../traits/traits.hpp" using namespace std; int show(char i, int j)
{
return ;
} struct Stu
{
int show(char i, int j)
{
return ;
}
}; int main()
{
// 变量;类型萃取
traits::type_traits<int>::const_value_type i = ; // 通过traits::type_traits可以萃取到int类型的各种"衍生"类型,如指针什么的 // 以下是C函数的相关萃取
traits::function_traits<int(char, int)>::FunctionP_Type func_ptr = show; // 得到指针
func_ptr('a', ); cout << traits::function_traits<int(char, int)>::arity << endl; // 萃取出参数个数
cout << typeid(traits::function_traits<int(char, int)>::arg2).name() << endl;//萃取出参数1的类型
cout << typeid(traits::function_traits<int(char, int)>::arg1).name() << endl;//萃取出参数2的类型 // 以下是类成员函数的相关萃取
traits::mfunction_traits<int(Stu::*)(char, int)>::MFunctionP_Type mfunc_ptr = &Stu::show; // 得到指针
Stu stu;
((&stu)->*mfunc_ptr)('a', ); cout << typeid(traits::mfunction_traits<int(Stu::*)(char, int)>::arg2).name() << endl;//萃取出参数1的类型
cout << typeid(traits::mfunction_traits<int(Stu::*)(char, int)>::arg1).name() << endl;//萃取出参数2的类型
cout << typeid(traits::mfunction_traits<int(Stu::*)(char, int)>::result_type).name() << endl;//萃取出返回值
cout << typeid(traits::mfunction_traits<int(Stu::*)(char, int)>::class_type).name() << endl;//萃取出类类型 // 以下展示从C函数指针转为类成员函数指针的技巧
traits::fun_to_mem_converter<int(char, int), Stu>::MFunctionP_Type mfunc_ptr2 = mfunc_ptr; // 以下展示从类成员函数指针转为C函数指针的技巧
traits::mem_to_fun_converter<int(Stu::*)(char, int)>::FunctionP_Type func_ptr2 = func_ptr;
return ;
}

接下来是traits库的完整代码

// traits.hpp

#ifndef TRAITS_INCLUDE
#define TRAITS_INCLUDE #include "function_traits.hpp"
#include "mfunction_traits.hpp"
#include "fun_to_mem_converter.hpp"
#include "mem_to_fun_converter.hpp"
#include "type_traits.hpp"
#include "pointer_integer_traits.hpp" #endif
// traits_config.hpp
#ifndef TRAITS_CONFIG_INCLUDE
#define TRAITS_CONFIG_INCLUDE #define NAMESPACE_TRAITS_BEGIN namespace traits{
#define NAMESPACE_TRAITS_END } #endif
//type_traits.hpp

#ifndef TYPE_TRAITS_INCLUDE
#define TYPE_TRAITS_INCLUDE #include "traits_config.hpp" NAMESPACE_TRAITS_BEGIN template<typename T>
struct type_traits
{
typedef T value_type;
typedef const T const_value_type;
typedef T* pointer_type;
typedef const T* const_pointer_type;
typedef T** pointer_pointer_type;
typedef const T** const_pointer_pointer_type;
typedef T& reference_type;
typedef const T& const_reference_type;
typedef T*& pointer_reference_type;
typedef const T*& const_pointer_reference_type; static bool is_reference(){return false;};
static bool is_pointer(){return false;};
static bool is_value(){return true;};
static bool is_pointer_reference(){return false;}
static bool is_pointer_pointer(){return false;} static bool is_const_reference(){return false;};
static bool is_const_pointer(){return false;};
static bool is_const_value(){return false;};
static bool is_const_pointer_reference(){return false;}
static bool is_const_pointer_pointer(){return false;}
}; template<typename T>
struct type_traits<const T> : public type_traits<T>
{
static bool is_const_reference(){return false;};
static bool is_const_pointer(){return false;};
static bool is_const_value(){return true;};
static bool is_const_pointer_reference(){return false;}
static bool is_const_pointer_pointer(){return false;}
}; template<typename T>
struct type_traits<T*>: public type_traits<T>
{
static bool is_reference(){return false;}
static bool is_pointer(){return true;}
static bool is_value(){return false;}
static bool is_pointer_reference(){return false;}
static bool is_pointer_pointer(){return false;}
}; template<typename T>
struct type_traits<const T*>: public type_traits<T*>
{
static bool is_const_reference(){return false;};
static bool is_const_pointer(){return true;};
static bool is_const_value(){return false;};
static bool is_const_pointer_reference(){return false;}
static bool is_const_pointer_pointer(){return false;}
}; template<typename T>
struct type_traits<T&>: public type_traits<T>
{
static bool is_reference(){return true;}
static bool is_pointer(){return false;}
static bool is_value(){return false;}
static bool is_pointer_reference(){return false;}
static bool is_pointer_pointer(){return false;}
}; template<typename T>
struct type_traits<const T&>: public type_traits<T&>
{
static bool is_const_reference(){return true;};
static bool is_const_pointer(){return false;};
static bool is_const_value(){return false;};
static bool is_const_pointer_reference(){return false;}
static bool is_const_pointer_pointer(){return false;}
}; template<typename T>
struct type_traits<T**>: public type_traits<T>
{
static bool is_reference(){return false;}
static bool is_pointer(){return false;}
static bool is_value(){return false;}
static bool is_pointer_reference(){return false;}
static bool is_pointer_pointer(){return true;}
}; template<typename T>
struct type_traits<const T**>: public type_traits<T**>
{
static bool is_const_reference(){return false;};
static bool is_const_pointer(){return false;};
static bool is_const_value(){return false;};
static bool is_const_pointer_reference(){return false;}
static bool is_const_pointer_pointer(){return true;}
}; template<typename T>
struct type_traits<T*&>: public type_traits<T>
{
static bool is_reference(){return false;}
static bool is_pointer(){return false;}
static bool is_value(){return false;}
static bool is_pointer_reference(){return true;}
static bool is_pointer_pointer(){return false;}
}; template<typename T>
struct type_traits<const T*&>: public type_traits<T*&>
{
static bool is_const_reference(){return false;};
static bool is_const_pointer(){return false;};
static bool is_const_value(){return false;};
static bool is_const_pointer_reference(){return true;}
static bool is_const_pointer_pointer(){return false;}
}; template<typename T>
struct type_expand_traits
{
typedef T value_type;
typedef T& reference_type;
typedef T* pointer_type;
typedef const T const_value_type;
typedef const T& const_reference_type;
typedef const T* const_pointer_type;
}; template<typename T>
struct type_expand_traits<const T>
{
typedef T value_type;
typedef T& reference_type;
typedef T* pointer_type;
typedef const T const_value_type;
typedef const T& const_reference_type;
typedef const T* const_pointer_type;
}; template<typename T>
struct type_expand_traits<T*>
{
typedef T* value_type;
typedef T*& reference_type;
typedef T** pointer_type;
typedef const T* const_value_type;
typedef const T*& const_reference_type;
typedef const T** const_pointer_type;
}; template<typename T>
struct type_expand_traits<const T*>
{
typedef T* value_type;
typedef T*& reference_type;
typedef T** pointer_type;
typedef const T* const_value_type;
typedef const T*& const_reference_type;
typedef const T** const_pointer_type;
}; template<typename T>
struct type_expand_traits<T**>
{
typedef T** value_type;
typedef const T** const_value_type;
}; template<typename T>
struct type_expand_traits<const T**>
{
typedef T** value_type;
typedef const T** const_value_type;
}; template<typename T>
struct type_expand_traits<T&>
{
typedef T value_type;
typedef T& reference_type;
typedef T* pointer_type;
typedef const T const_value_type;
typedef const T& const_reference_type;
typedef const T* const_pointer_type;
}; template<typename T>
struct type_expand_traits<const T&>
{
typedef T value_type;
typedef T& reference_type;
typedef T* pointer_type;
typedef const T const_value_type;
typedef const T& const_reference_type;
typedef const T* const_pointer_type;
}; template<typename T>
struct type_expand_traits<T*&>
{
typedef T* value_type;
typedef T*& reference_type;
typedef T** pointer_type;
typedef const T* const_value_type;
typedef const T*& const_reference_type;
typedef const T** const_pointer_type;
}; template<typename T>
struct type_expand_traits<const T*&>
{
typedef T* value_type;
typedef T*& reference_type;
typedef T** pointer_type;
typedef const T* const_value_type;
typedef const T*& const_reference_type;
typedef const T** const_pointer_type;
}; NAMESPACE_TRAITS_END
#endif
//pointer_integer_traits.hpp

/*
函数地址与整数之间的转换
*/
#ifndef POINTER_INTEGER_TRAITS_INCLUDE
#define POINTER_INTEGER_TRAITS_INCLUDE #include "traits_config.hpp" NAMESPACE_TRAITS_BEGIN // 指针与整数的转换
template<typename funp>
struct _pointer_integer_traits
{
protected:
funp _fun;
_pointer_integer_traits(unsigned int addr)
{
union
{
funp _fun;
unsigned int _addr;
}_u;
_u._addr = addr;
_fun = _u._fun;
}
public:
operator funp()
{
return _fun;
}
}; template<>
struct _pointer_integer_traits<unsigned int>
{
protected:
unsigned int _addr;
template<typename funp>
_pointer_integer_traits(funp fun)
{
union
{
funp _fun;
unsigned int _addr;
}_u;
_u._fun = fun;
_addr = _u._addr;
}
public:
operator unsigned int()
{
return _addr;
}
}; template<typename funp>
struct pointer_integer_traits : public _pointer_integer_traits<funp>
{
pointer_integer_traits(const unsigned int addr):_pointer_integer_traits<funp>(addr){}
}; template<typename funp>
struct pointer_integer_traits<const funp*> : public _pointer_integer_traits<funp>
{
pointer_integer_traits(const unsigned int addr):_pointer_integer_traits<funp>(addr){}
}; template<>
struct pointer_integer_traits<int> : public _pointer_integer_traits<unsigned int>
{
template<typename funp>
pointer_integer_traits(funp fun):_pointer_integer_traits<unsigned int>(fun){} template<typename funp>
pointer_integer_traits(const funp* fun):_pointer_integer_traits<unsigned int>(fun){}
}; template<>
struct pointer_integer_traits<unsigned int> : public _pointer_integer_traits<unsigned int>
{
template<typename funp>
pointer_integer_traits(funp fun):_pointer_integer_traits<unsigned int>(fun){} template<typename funp>
pointer_integer_traits(const funp* fun):_pointer_integer_traits<unsigned int>(fun){}
}; ////////////////////////////////////////// // 指针与引用的换
template<typename T>
struct pointer_reference_traits; template<typename T>
struct pointer_reference_traits<T&>
{
T* _p;
pointer_reference_traits(const T* p)
{
_p = const_cast<T*>(p);
}
operator T&(){return *_p;}
}; template<typename T>
struct pointer_reference_traits<const T&>
{
T* _p;
pointer_reference_traits(const T* p)
{
_p = const_cast<T*>(p);
}
operator const T&(){return *_p;}
}; template<typename T>
struct pointer_reference_traits<T*>
{
T* _p;
pointer_reference_traits(const T& p)
{
_p = const_cast<T*>(&p);
}
operator T*(){return _p;}
}; template<typename T>
struct pointer_reference_traits<const T*>
{
T* _p;
pointer_reference_traits(const T& p)
{
_p = const_cast<T*>(&p);
}
operator const T*(){return _p;}
}; ///////////////////////////////// NAMESPACE_TRAITS_END
#endif
// mfunction_traits.hpp

#ifndef MFUNCTION_TRAITS_INCLUDE
#define MFUNCTION_TRAITS_INCLUDE #include "traits_config.hpp" NAMESPACE_TRAITS_BEGIN template<typename Function> struct mfunction_traits_helper; template<typename Classtype,typename R>
struct mfunction_traits_helper<R(Classtype::*)()>
{
enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg1)>
{
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg2,Arg1)>
{
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg3,Arg2,Arg1)>
{
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,
typename Arg15,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg15,Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg15 arg15;
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,
typename Arg16,
typename Arg15,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg16,Arg15,Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg16 arg16;
typedef Arg15 arg15;
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,
typename Arg17,
typename Arg16,
typename Arg15,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg17,Arg16,Arg15,Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg17 arg17;
typedef Arg16 arg16;
typedef Arg15 arg15;
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,
typename Arg18,
typename Arg17,
typename Arg16,
typename Arg15,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg18,Arg17,Arg16,Arg15,Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg18 arg18;
typedef Arg17 arg17;
typedef Arg16 arg16;
typedef Arg15 arg15;
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,
typename Arg19,
typename Arg18,
typename Arg17,
typename Arg16,
typename Arg15,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg19,Arg18,Arg17,Arg16,Arg15,Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg19 arg19;
typedef Arg18 arg18;
typedef Arg17 arg17;
typedef Arg16 arg16;
typedef Arg15 arg15;
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename Classtype,typename R,
typename Arg20,
typename Arg19,
typename Arg18,
typename Arg17,
typename Arg16,
typename Arg15,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper<R(Classtype::*)(Arg20,Arg19,Arg18,Arg17,Arg16,Arg15,Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg20 arg20;
typedef Arg19 arg19;
typedef Arg18 arg18;
typedef Arg17 arg17;
typedef Arg16 arg16;
typedef Arg15 arg15;
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
typedef Classtype class_type;
}; template<typename _MFunctionP_Type>
struct mfunction_traits : public mfunction_traits_helper<_MFunctionP_Type>
{
typedef _MFunctionP_Type MFunctionP_Type;
}; NAMESPACE_TRAITS_END
#endif
//mem_to_fun_converter.hpp

#ifndef MEM_TO_FUN_CONVERTER_INCLUDE
#define MEM_TO_FUN_CONVERTER_INCLUDE /*@brief:
换成员函数指针类型转为普通函数类型*/ #include "traits_config.hpp"
#include "mfunction_traits.hpp" NAMESPACE_TRAITS_BEGIN template<int Arity, typename funtype>
struct mem_to_fun_converter_helper; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef typename _traits::result_type(*FunctionP_Type)();
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef typename _traits::result_type(*FunctionP_Type)(typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef typename _traits::result_type(*FunctionP_Type)(typename _traits::arg2,typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef typename _traits::result_type(*FunctionP_Type)(typename _traits::arg3,typename _traits::arg2,typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg15,
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg16,
typename _traits::arg15,
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg17,
typename _traits::arg16,
typename _traits::arg15,
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg18,
typename _traits::arg17,
typename _traits::arg16,
typename _traits::arg15,
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg19,
typename _traits::arg18,
typename _traits::arg17,
typename _traits::arg16,
typename _traits::arg15,
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename funtype>
struct mem_to_fun_converter_helper<,funtype>
{
typedef mfunction_traits<funtype> _traits; typedef
typename _traits::result_type(*FunctionP_Type)
(
typename _traits::arg20,
typename _traits::arg19,
typename _traits::arg18,
typename _traits::arg17,
typename _traits::arg16,
typename _traits::arg15,
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename Signature>
struct mem_to_fun_converter
{
typedef
typename mem_to_fun_converter_helper<mfunction_traits<Signature>::arity,Signature>::FunctionP_Type
FunctionP_Type;
}; NAMESPACE_TRAITS_END
#endif
// function_traits.hpp

#ifndef FUNCTION_TRAITS_INCLUDE
#define FUNCTION_TRAITS_INCLUDE #include "traits_config.hpp" NAMESPACE_TRAITS_BEGIN template<typename Function>
struct function_pointer_traits
{
typedef Function* FunctionP_Type;
typedef Function Function_Type;
}; template<typename Function>
struct function_pointer_traits<Function*>
{
typedef Function* FunctionP_Type;
typedef Function Function_Type;
}; template<typename Function> struct function_traits_helper; template<typename R>
struct function_traits_helper<R(*)()>
{
enum{arity = };
typedef R result_type;
}; template<typename R,typename Arg1>
struct function_traits_helper<R(*)(Arg1)>
{
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg2,Arg1)>
{
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg3,Arg2,Arg1)>
{
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,
typename Arg15,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg15,Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg15 arg15;
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,
typename Arg16,
typename Arg15,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg16,Arg15,Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg16 arg16;
typedef Arg15 arg15;
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,
typename Arg17,
typename Arg16,
typename Arg15,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg17,Arg16,Arg15,Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg17 arg17;
typedef Arg16 arg16;
typedef Arg15 arg15;
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,
typename Arg18,
typename Arg17,
typename Arg16,
typename Arg15,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg18,Arg17,Arg16,Arg15,Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg18 arg18;
typedef Arg17 arg17;
typedef Arg16 arg16;
typedef Arg15 arg15;
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,
typename Arg19,
typename Arg18,
typename Arg17,
typename Arg16,
typename Arg15,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg19,Arg18,Arg17,Arg16,Arg15,Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg19 arg19;
typedef Arg18 arg18;
typedef Arg17 arg17;
typedef Arg16 arg16;
typedef Arg15 arg15;
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename R,
typename Arg20,
typename Arg19,
typename Arg18,
typename Arg17,
typename Arg16,
typename Arg15,
typename Arg14,
typename Arg13,
typename Arg12,
typename Arg11,
typename Arg10,
typename Arg9,
typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper<R(*)(Arg20,Arg19,Arg18,Arg17,Arg16,Arg15,Arg14,Arg13,Arg12,Arg11,Arg10,Arg9,Arg8,Arg7,Arg6,Arg5,Arg4,Arg3,Arg2,Arg1)>
{
typedef Arg20 arg20;
typedef Arg19 arg19;
typedef Arg18 arg18;
typedef Arg17 arg17;
typedef Arg16 arg16;
typedef Arg15 arg15;
typedef Arg14 arg14;
typedef Arg13 arg13;
typedef Arg11 arg11;
typedef Arg10 arg10;
typedef Arg9 arg9;
typedef Arg8 arg8;
typedef Arg7 arg7;
typedef Arg6 arg6;
typedef Arg5 arg5;
typedef Arg4 arg4;
typedef Arg3 arg3;
typedef Arg2 arg2;
typedef Arg1 arg1; enum{arity = };
typedef R result_type;
}; template<typename _Function_Type>
struct function_traits : public function_traits_helper<typename function_pointer_traits<_Function_Type>::FunctionP_Type>
{
typedef typename function_pointer_traits<_Function_Type>::Function_Type Function_Type;
typedef typename function_pointer_traits<_Function_Type>::FunctionP_Type FunctionP_Type;
}; NAMESPACE_TRAITS_END
#endif
// fun_to_mem_converter.hpp

#ifndef FUN_TO_MEM_CONVERTER_INCLUDE
#define FUN_TO_MEM_CONVERTER_INCLUDE #include "traits_config.hpp"
#include "function_traits.hpp" NAMESPACE_TRAITS_BEGIN template<int Arity,typename classtype, typename funtype>
struct fun_to_mem_converter_helper; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef typename _traits::result_type(classtype::*MFunctionP_Type)();
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef typename _traits::result_type(classtype::*MFunctionP_Type)(typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef typename _traits::result_type(classtype::*MFunctionP_Type)(typename _traits::arg2,typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef typename _traits::result_type(classtype::*MFunctionP_Type)(typename _traits::arg3,typename _traits::arg2,typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg15,
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg16,
typename _traits::arg15,
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg17,
typename _traits::arg16,
typename _traits::arg15,
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg18,
typename _traits::arg17,
typename _traits::arg16,
typename _traits::arg15,
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg19,
typename _traits::arg18,
typename _traits::arg17,
typename _traits::arg16,
typename _traits::arg15,
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename classtype,typename funtype>
struct fun_to_mem_converter_helper<,classtype,funtype>
{
typedef function_traits<funtype> _traits; typedef
typename _traits::result_type(classtype::*MFunctionP_Type)
(
typename _traits::arg20,
typename _traits::arg19,
typename _traits::arg18,
typename _traits::arg17,
typename _traits::arg16,
typename _traits::arg15,
typename _traits::arg14,
typename _traits::arg13,
typename _traits::arg12,
typename _traits::arg11,
typename _traits::arg10,
typename _traits::arg9,
typename _traits::arg8,
typename _traits::arg7,
typename _traits::arg6,
typename _traits::arg5,
typename _traits::arg4,
typename _traits::arg3,
typename _traits::arg2,
typename _traits::arg1);
}; template<typename Signature, typename classtype>
struct fun_to_mem_converter
{
typedef
typename fun_to_mem_converter_helper<function_traits<Signature>::arity,classtype,typename function_traits<Signature>::FunctionP_Type>::MFunctionP_Type
MFunctionP_Type;
}; NAMESPACE_TRAITS_END
#endif

头一回发博客,来分享个有关C++类型萃取的编写技巧的更多相关文章

  1. C蛮的全栈之路-node篇(二) 实战一:自动发博客

    目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 ---------------- 我是分割线 ---- ...

  2. hexo next主题为博客添加分享功能

    title: hexo next主题为博客添加分享功能 date: 2018-01-06 20:20:02 tags: [hexo博客, 博客配置] categories: hexo next主题配置 ...

  3. Linux 桌面玩家指南:05. 发博客必备的图片处理和视频录制神器

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  4. 关于如何使用Microsoft Word发博客

    关于如何使用Microsoft Word发博客   PS:以Microsoft Word 2010为例作具体操作,实际上Microsoft Word 2007也可以完成该功能,略有差异,但是只能是20 ...

  5. vscode发博客插件更新v0.1.0(可能会相对好用点吧)

    距离上一次编写这个vscode在博客园发博客的插件已经过去好久了,那个时候vscode插件的功能也没有那么强大,期间有人提出问题来,也有人提出建议来,我一直没有抽出时间来维护,深感抱歉,直到有人加到我 ...

  6. Vno博客样式分享

    不知不觉有一年多没有更新博客了,还是几位园友因为喜欢这套博客样式发了消息,否则我都快忘记自己还有一个博客了,哈哈. 言归正传,这套博客样式是当时闲来无事copy的iOS界喵神的博客Vno,确实很漂亮, ...

  7. 用Windows Live Writer 2012发博客

    一.软件准备: 最新版的是Windows Live Writer 2012,但是不提供单独的安装包,它是和微软其它软件一起的(包括MSN.Window Move Maker等),软件大小为131M,官 ...

  8. 菜鸟博客装饰分享CSS+HTML+js

    博客布局更改,各种百度,自己修改,搞成现在这样,有兴趣的朋友可以复制我下面的把自己博客覆盖了,然后在进行更改 不懂可加群问我:675678830 如果想开通打赏,用到js,需要在 下列中 博客侧边栏公 ...

  9. (转)第一次发博客-说说我的B/S开发框架(asp.net mvc + web api + easyui)

    原文地址:http://www.cnblogs.com/xqin/archive/2013/05/29/3105291.html 前言 这些年一直在.net下做企业web系统开发,前前后后经历的不同的 ...

随机推荐

  1. Microsoft Internet Explorer 内存破坏漏洞(CVE-2013-3193)(MS13-059)

    漏洞版本: Microsoft Internet Explorer 6 - 10 漏洞描述: BUGTRAQ ID: 61678 CVE(CAN) ID: CVE-2013-3193 Windows ...

  2. web页面布局思想

    一.盒子模型 网页可以看成由一个个"盒子"组成,如图: 由上图可以看出,页面分为上(网站导航).中.下(版权声明)三个部分,中间部分又分为左(商品分类).中(主要部分).右,这些版 ...

  3. @repository注解

    Spring的注解形式:@Repository.@Service.@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean. @Repository.@Service.@C ...

  4. simulink下直接代码生成

    连接好DSP,打开Matlab,首先必须要更改环境,要不不能编译通过 输入C2000lib,打开库, 在C2833X DSP Chip Support中添加外设,然后在C2000 Target Pre ...

  5. this用法

    this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 1.纯粹函数调用. function test() { this. ...

  6. 以O2O为核心的ERP思考

    O2O已经火了一阵子了,很多人都在说O2O,各行各业都想和O2O有所结合,都认为这里面将会有巨大的商机. 在互联网发展到移动互联网的时代,我们的生活的很多方面已经被改变了,很多事情都已经可以在移动端完 ...

  7. hive UDAF源代码分析

    sss /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license a ...

  8. 【题解】警位安排( 树形 DP)

    [题目描述]一个重要的基地被分成了 n 个连通的区域 , 出于某种原因 , 这个基地以某一个区域为核心,呈一树形分布.在每个区域里安排警卫的费用是不同的,而每个区域的警卫都可以望见其相邻的区域 .如果 ...

  9. 【设计模式 - 15】之解释器模式(Interpreter)

    1      模式简介 解释器模式允许我们自定义一种语言,并定义一个这种语言的解释器,这个解释器用来解释语言中的句子.由于这种模式主要用于编译器的编写,因此在日常应用中不是很常用. 如果一种特定类型的 ...

  10. 圣诞节来了,雪花纷飞的CSS3动画

    原文链接:http://www.html5think.com/article/index/id/80