C++类型萃取编写技巧

C++类型萃取编写技巧,废话不多说,上来贴代码最实在,以下代码量有点多,不过这都是在下一手一手敲出来的,小巧好用,把以下代码复制出来,放到相应的hpp文件即可,VS,GCC下均能编译通过

#include
#include “../../traits/traits.hpp”

using namespace std;

int show(char i, int j)
{
    return 1;
}

struct Stu
{
    int show(char i, int j)
    {
        return 1;
    }
};

int main()
{
    // 变量;类型萃取
    traits::type_traits::const_value_type i = 5; // 通过traits::type_traits可以萃取到int类型的各种”衍生”类型,如指针什么的

    // 以下是C函数的相关萃取
    traits::function_traits::FunctionP_Type func_ptr = show; // 得到指针
    func_ptr(‘a’, 4);

    cout << traits::function_traits::arity << endl; // 萃取出参数个数
    cout << typeid(traits::function_traits::arg2).name() << endl;//萃取出参数1的类型
    cout << typeid(traits::function_traits::arg1).name() << endl;//萃取出参数2的类型

    // 以下是类成员函数的相关萃取
    traits::mfunction_traits::MFunctionP_Type mfunc_ptr = &Stu::show; // 得到指针
    Stu stu;
    ((&stu)->*mfunc_ptr)(‘a’, 4);

    cout << typeid(traits::mfunction_traits::arg2).name() << endl;//萃取出参数1的类型
    cout << typeid(traits::mfunction_traits::arg1).name() << endl;//萃取出参数2的类型
    cout << typeid(traits::mfunction_traits::result_type).name() << endl;//萃取出返回值
    cout << typeid(traits::mfunction_traits::class_type).name() << endl;//萃取出类类型
   
    // 以下展示从C函数指针转为类成员函数指针的技巧
    traits::fun_to_mem_converter::MFunctionP_Type mfunc_ptr2 = mfunc_ptr;
   
    // 以下展示从类成员函数指针转为C函数指针的技巧
    traits::mem_to_fun_converter::FunctionP_Type func_ptr2 = func_ptr;
    return 0;
}

接下来是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
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
struct type_traits : public type_traits
{
    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
struct type_traits: public type_traits
{
    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
struct type_traits: public type_traits
{
    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
struct type_traits: public type_traits
{
    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
struct type_traits: public type_traits
{
    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
struct type_traits: public type_traits
{
    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
struct type_traits: public type_traits
{
    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
struct type_traits: public type_traits
{
    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
struct type_traits: public type_traits
{
    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
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
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
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
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
struct type_expand_traits
{
    typedef T** value_type;
    typedef const T** const_value_type;
};

template
struct type_expand_traits
{
    typedef T** value_type;
    typedef const T** const_value_type;
};

template
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
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
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
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;
};

 

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
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
{
protected:
    unsigned int _addr;
    template
    _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
struct pointer_integer_traits : public _pointer_integer_traits
{
    pointer_integer_traits(const unsigned int addr):_pointer_integer_traits(addr){}
};

template
struct pointer_integer_traits : public _pointer_integer_traits
{
    pointer_integer_traits(const unsigned int addr):_pointer_integer_traits(addr){}
};

template<>
struct pointer_integer_traits : public _pointer_integer_traits
{
    template
    pointer_integer_traits(funp fun):_pointer_integer_traits(fun){}

    template
    pointer_integer_traits(const funp* fun):_pointer_integer_traits(fun){}
};

template<>
struct pointer_integer_traits : public _pointer_integer_traits
{
    template
    pointer_integer_traits(funp fun):_pointer_integer_traits(fun){}

    template
    pointer_integer_traits(const funp* fun):_pointer_integer_traits(fun){}
};

 

//////////////////////////////////////////

// 指针与引用的换
template
struct pointer_reference_traits;

template
struct pointer_reference_traits
{
    T* _p;
    pointer_reference_traits(const T* p)
    {
        _p = const_cast(p);
    }
    operator T&(){return *_p;}
};

template
struct pointer_reference_traits
{
    T* _p;
    pointer_reference_traits(const T* p)
    {
        _p = const_cast(p);
    }
    operator const T&(){return *_p;}
};

template
struct pointer_reference_traits
{
    T* _p;
    pointer_reference_traits(const T& p)
    {
        _p = const_cast(&p);
    }
    operator T*(){return _p;}
};

template
struct pointer_reference_traits
{
    T* _p;
    pointer_reference_traits(const T& p)
    {
        _p = const_cast(&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 struct mfunction_traits_helper;

template
struct mfunction_traits_helper
{
    enum{arity = 0};
    typedef R result_type;
    typedef Classtype class_type;
};

template
struct mfunction_traits_helper
{
    typedef Arg1 arg1;

    enum{arity = 1};
    typedef R result_type;
    typedef Classtype class_type;
};

template
struct mfunction_traits_helper
{
    typedef Arg2 arg2;
    typedef Arg1 arg1;

    enum{arity = 2};
    typedef R result_type;
    typedef Classtype class_type;
};

template
struct mfunction_traits_helper
{
    typedef Arg3 arg3;
    typedef Arg2 arg2;
    typedef Arg1 arg1;

    enum{arity = 3};
    typedef R result_type;
    typedef Classtype class_type;
};

template
struct mfunction_traits_helper
{
    typedef Arg4 arg4;
    typedef Arg3 arg3;
    typedef Arg2 arg2;
    typedef Arg1 arg1;

    enum{arity = 4};
    typedef R result_type;
    typedef Classtype class_type;
};

template
struct mfunction_traits_helper
{
    typedef Arg5 arg5;
    typedef Arg4 arg4;
    typedef Arg3 arg3;
    typedef Arg2 arg2;
    typedef Arg1 arg1;

    enum{arity = 5};
    typedef R result_type;
    typedef Classtype class_type;
};

template
struct mfunction_traits_helper
{
    typedef Arg6 arg6;
    typedef Arg5 arg5;
    typedef Arg4 arg4;
    typedef Arg3 arg3;
    typedef Arg2 arg2;
    typedef Arg1 arg1;

    enum{arity = 6};
    typedef R result_type;
    typedef Classtype class_type;
};

template
struct mfunction_traits_helper
{
    typedef Arg7 arg7;
    typedef Arg6 arg6;
    typedef Arg5 arg5;
    typedef Arg4 arg4;
    typedef Arg3 arg3;
    typedef Arg2 arg2;
    typedef Arg1 arg1;

    enum{arity = 7};
    typedef R result_type;
    typedef Classtype class_type;
};

template
struct mfunction_traits_helper
{
    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 = 8};
    typedef R result_type;
    typedef Classtype class_type;
};

template    typename Arg9,
    typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper
{
    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 = 9};
    typedef R result_type;
    typedef Classtype class_type;
};

template    typename Arg10,
    typename Arg9,
    typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct mfunction_traits_helper
{
    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 = 10};
    typedef R result_type;
    typedef Classtype class_type;
};

template    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
{
    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 = 11};
    typedef R result_type;
    typedef Classtype class_type;
};

template    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
{
    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 = 12};
    typedef R result_type;
    typedef Classtype class_type;
};

template    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
{
    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 = 13};
    typedef R result_type;
    typedef Classtype class_type;
};

template    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
{
    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 = 14};
    typedef R result_type;
    typedef Classtype class_type;
};

template    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
{
    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 = 15};
    typedef R result_type;
    typedef Classtype class_type;
};

template    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
{
    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 = 16};
    typedef R result_type;
    typedef Classtype class_type;
};

template    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
{
    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 = 17};
    typedef R result_type;
    typedef Classtype class_type;
};

template    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
{
    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 = 18};
    typedef R result_type;
    typedef Classtype class_type;
};

template    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
{
    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 = 19};
    typedef R result_type;
    typedef Classtype class_type;
};

template    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
{
    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 = 20};
    typedef R result_type;
    typedef Classtype class_type;
};

template
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
struct mem_to_fun_converter_helper;

template
struct mem_to_fun_converter_helper<0,funtype>
{
    typedef mfunction_traits _traits;

    typedef typename _traits::result_type(*FunctionP_Type)();
};

template
struct mem_to_fun_converter_helper<1,funtype>
{
    typedef mfunction_traits _traits;

    typedef typename _traits::result_type(*FunctionP_Type)(typename _traits::arg1);
};

template
struct mem_to_fun_converter_helper<2,funtype>
{
    typedef mfunction_traits _traits;

    typedef typename _traits::result_type(*FunctionP_Type)(typename _traits::arg2,typename _traits::arg1);
};

template
struct mem_to_fun_converter_helper<3,funtype>
{
    typedef mfunction_traits _traits;

    typedef typename _traits::result_type(*FunctionP_Type)(typename _traits::arg3,typename _traits::arg2,typename _traits::arg1);
};

template
struct mem_to_fun_converter_helper<4,funtype>
{
    typedef mfunction_traits _traits;

    typedef
        typename _traits::result_type(*FunctionP_Type)
        (
        typename _traits::arg4,
        typename _traits::arg3,
        typename _traits::arg2,
        typename _traits::arg1);
};

template
struct mem_to_fun_converter_helper<5,funtype>
{
    typedef mfunction_traits _traits;

    typedef
        typename _traits::result_type(*FunctionP_Type)
        (
        typename _traits::arg5,
        typename _traits::arg4,
        typename _traits::arg3,
        typename _traits::arg2,
        typename _traits::arg1);
};

template
struct mem_to_fun_converter_helper<6,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<7,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<8,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<9,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<10,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<11,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<12,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<13,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<14,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<15,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<16,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<17,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<18,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<19,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter_helper<20,funtype>
{
    typedef mfunction_traits _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
struct mem_to_fun_converter
{
    typedef
        typename mem_to_fun_converter_helper::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
struct function_pointer_traits
{
    typedef Function* FunctionP_Type;
    typedef Function  Function_Type;
};

template
struct function_pointer_traits
{
    typedef Function* FunctionP_Type;
    typedef Function  Function_Type;
};

template struct function_traits_helper;

template
struct function_traits_helper
{
    enum{arity = 0};
    typedef R result_type;
};

template
struct function_traits_helper
{
    typedef Arg1 arg1;

    enum{arity = 1};
    typedef R result_type;
};

template
struct function_traits_helper
{
    typedef Arg2 arg2;
    typedef Arg1 arg1;

    enum{arity = 2};
    typedef R result_type;
};

template
struct function_traits_helper
{
    typedef Arg3 arg3;
    typedef Arg2 arg2;
    typedef Arg1 arg1;

    enum{arity = 3};
    typedef R result_type;
};

template
struct function_traits_helper
{
    typedef Arg4 arg4;
    typedef Arg3 arg3;
    typedef Arg2 arg2;
    typedef Arg1 arg1;

    enum{arity = 4};
    typedef R result_type;
};

template
struct function_traits_helper
{
    typedef Arg5 arg5;
    typedef Arg4 arg4;
    typedef Arg3 arg3;
    typedef Arg2 arg2;
    typedef Arg1 arg1;

    enum{arity = 5};
    typedef R result_type;
};

template
struct function_traits_helper
{
    typedef Arg6 arg6;
    typedef Arg5 arg5;
    typedef Arg4 arg4;
    typedef Arg3 arg3;
    typedef Arg2 arg2;
    typedef Arg1 arg1;

    enum{arity = 6};
    typedef R result_type;
};

template
struct function_traits_helper
{
    typedef Arg7 arg7;
    typedef Arg6 arg6;
    typedef Arg5 arg5;
    typedef Arg4 arg4;
    typedef Arg3 arg3;
    typedef Arg2 arg2;
    typedef Arg1 arg1;

    enum{arity = 7};
    typedef R result_type;
};

template
struct function_traits_helper
{
    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 = 8};
    typedef R result_type;
};

template    typename Arg9,
    typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper
{
    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 = 9};
    typedef R result_type;
};

template    typename Arg10,
    typename Arg9,
    typename Arg8,typename Arg7,typename Arg6,typename Arg5,typename Arg4,typename Arg3,typename Arg2,typename Arg1>
struct function_traits_helper
{
    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 = 10};
    typedef R result_type;
};

template    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
{
    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 = 11};
    typedef R result_type;
};

template    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
{
    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 = 12};
    typedef R result_type;
};

template    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
{
    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 = 13};
    typedef R result_type;
};

template    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
{
    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 = 14};
    typedef R result_type;
};

template    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
{
    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 = 15};
    typedef R result_type;
};

template    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
{
    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 = 16};
    typedef R result_type;
};

template    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
{
    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 = 17};
    typedef R result_type;
};

template    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
{
    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 = 18};
    typedef R result_type;
};

template    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
{
    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 = 19};
    typedef R result_type;
};

template    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
{
    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 = 20};
    typedef R result_type;
};

 

template
struct function_traits : public function_traits_helper::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
struct fun_to_mem_converter_helper;

template
struct fun_to_mem_converter_helper<0,classtype,funtype>
{
    typedef function_traits _traits;

    typedef typename _traits::result_type(classtype::*MFunctionP_Type)();
};

template
struct fun_to_mem_converter_helper<1,classtype,funtype>
{
    typedef function_traits _traits;

    typedef typename _traits::result_type(classtype::*MFunctionP_Type)(typename _traits::arg1);
};

template
struct fun_to_mem_converter_helper<2,classtype,funtype>
{
    typedef function_traits _traits;

    typedef typename _traits::result_type(classtype::*MFunctionP_Type)(typename _traits::arg2,typename _traits::arg1);
};

template
struct fun_to_mem_converter_helper<3,classtype,funtype>
{
    typedef function_traits _traits;

    typedef typename _traits::result_type(classtype::*MFunctionP_Type)(typename _traits::arg3,typename _traits::arg2,typename _traits::arg1);
};

template
struct fun_to_mem_converter_helper<4,classtype,funtype>
{
    typedef function_traits _traits;

    typedef
        typename _traits::result_type(classtype::*MFunctionP_Type)
        (
        typename _traits::arg4,
        typename _traits::arg3,
        typename _traits::arg2,
        typename _traits::arg1);
};

template
struct fun_to_mem_converter_helper<5,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<6,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<7,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<8,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<9,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<10,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<11,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<12,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<13,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<14,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<15,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<16,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<17,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<18,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<19,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter_helper<20,classtype,funtype>
{
    typedef function_traits _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
struct fun_to_mem_converter
{
    typedef
        typename fun_to_mem_converter_helper::arity,classtype,typename function_traits::FunctionP_Type>::MFunctionP_Type
    MFunctionP_Type;
};

NAMESPACE_TRAITS_END
#endif