zoukankan      html  css  js  c++  java
  • 谈一下信号分发器的作用及实现方法

    信号分发器在很多游戏项目中都有使用,是一种典型的观察者模式。在游戏编程中,客户端的绘制往往需要靠逻辑数据来驱动,绘制通过监听信号等待逻辑的通知。当然了,逻辑模块跟逻辑模块相互之间的通知也可以使用信号。这种编程模式能够简化模块之间的通信问题,不需要引用烦人的指针调用,导致指针满屏飞的情况。C++恶心的地方就是在大型项目中,指针相当多。

    那边,实现一个信号分发器需要哪些功能呢?我们知道,所谓的信号通知,无非就是函数调用。监听一个信号,其本质上就是绑定一个指针,这个问题的难点在于函数指针是各式各样的,那么我们怎么样来管理这些指针呢?毕竟我们是想通过一个类似list的集合来保存这些指针。有的人可能会想到用同一种list保持同一种指针,因为一个信号也许只对应一种函数签名,如果你采用了这种方法,那么很不幸告诉你,你实现起来会困难重重。要是在Java上,这个问题很好解决,因为JAVA上所有的引用类型对象都自动继承自Object对象。在C++上,解决这个问题一有两种方法:1是把所有的指针转换成int数值,这个能解决指针存问题。2是借用函数包装。这两种方法中,方法1显的很粗糙,无法实现类型安全检查;方法2就显示的很优雅,而且能在编译时期进行接口信号是否匹配问题的检查。那么接下来我们的讨论将以方法2为准,来讲解一个实现。

    上面的指针保存问题是实现信号分发器遇到第一个要解决的问题。第二个问题就是,采用函数包装这种方式,为了方便函数调用,我们需要对参数进行序列化。

    以下是一个信号分发器的实现原理的大体流程:

    1.绑定一个信号,即有一个类似这样的结构: std::map<int,std::list<func_ptr>>, 将函数指针放入信号对应的函数指针集中。

    2.对这个信号进行通知,即通知这个信号找到对应的std::list<func_ptr>, 然后将传递的参数进行序列化,将之传送到相应的处理例程,由相应的处理例程对参数进行反序列化,解析出各个参数,遍历std::list<func_ptr>集合调用函数。

    至此过程完毕,没错,就是这么简单。

    总结一下需要用到的相应的库:一个类型萃取库traits,一个序列化库serialization,一个函数包装库callhelper。如果看过我之前博文的同学,那么就会注意到在下的小心机了,这三个库在下都一一按顺序发布过了。

    接下来简单介绍下这个信号分发器的相应用法及主要功能。

    这个库实现的主要三个优点:

    1. 在调一次信号时只会产生一次序列化和一次反序列化消耗,这个应该是不可避免。大家要是有好的方法欢迎来讨论长知识(我见过会产生一次序列化和n次反序列化的信号库实现,原来公司项目中使用的一次实现就是这样,这个其实是没有必要的)。

    2. 这个信号库允许一个信号对应多个不同签名的调用接口,至少实战中到底有没有这个必要,这里暂时不讨论。

    3. 支持引用类型及指针类型的传递。

    一个额外的支持就是这个库可以增加信号过滤器的,这个过滤器代码我就不贴出了。

    接下来贴代码,说的再多,不如看代码:

    #include "signalcall2/signalcall2.hpp"
    
    // 声明一个信号并绑定一类签名
    DECLARE_SIGNAL2(SIG_TEST,1,void(std::string&))
    // 使用同一个信号并绑定别一类签名
    VALIDE_SIGNAL(SIG_TEST,void(std::string ,int))
    
    int main()
    {
        // 定义一个类对象
        Stu stu;
    
        // 定义一个信号分发器对象
        signalcall::signalcall2 sig; // 你可能会好奇为什么是signalcall2,因为我还实现过一个版本1,这是版本2,版本1并不具备版本2的优雅性。
        // 绑定信号
        // 前两个接口是同一类型的签名
        sig.bindSignal<SIG_TEST>(show);
        sig.bindSignal<SIG_TEST>(&stu,&Stu::show);
        // 这个接口是不同的签名
        sig.bindSignal<SIG_TEST>(show2);
    
        // sig.bindSignal<SIG_TEST>(show3); // 当试图绑定show3函数,会编译不过,因为并没指声明信号SIG_TEST对应void(int)类型签名
    
        // 通知信号
        std::string str = "你好,我是字符串!";
        // 只会通知到void(std::string&)类型的接口
        sig.signal<SIG_TEST>(str);
    
        // 只会通知到void(std::string,int)类型的接口
        sig.signal<SIG_TEST>("我是void(std::string,int)类型的接口",1);
    

       // 解绑信号相应的接口
       sig.unbindSignal<SIG_TEST>(show);

    
    

       // 或者解决信号的所有接口
       sig.unbindAllSignal();

    return 0;
    }

    输出结果:

    接下来是完整类库截图

    //signalcall_config2.hpp
    #ifndef SIGNALCALL_CONFIG2_INCLUDE
    #define SIGNALCALL_CONFIG2_INCLUDE
    
    #define NAMESPACE_SIGNALCALL_BEGIN    namespace signalcall{
    #define NAMESPACE_SIGNALCALL_END    }
    
    #include "serialization/archive.hpp"
    #include "call_helper/call.hpp"
    
    NAMESPACE_SIGNALCALL_BEGIN
    
    typedef serialization::default_string_oarchive OArchive;
    typedef serialization::default_string_iarchive IArchive;
    
    
    
    NAMESPACE_SIGNALCALL_END
    #endif
    //signal_type2.hpp
    #ifndef SIGNAL_TYPE_INCLUDE
    #define SIGNAL_TYPE_INCLUDE
    
    #include "traits/traits.hpp"
    
    typedef unsigned int SigID; //消息ID的格式
    typedef unsigned int ParamC; //函数参数个数
    
    template<SigID sigID,ParamC paramC> struct signature_trait;
    
    /**分一步直接定义信号**/
    #define DECLARE_SIGNAL2(signal_name, signal_id, signature)                                            
        enum {signal_name = signal_id};                                                                    
                                                                                                        
    template<>                                                                                            
    struct signature_trait<signal_name,traits::function_traits<signature>::arity>                        
    {                                                                                                    
        typedef traits::function_traits<signature>::Function_Type Function_Type;                        
        typedef traits::function_traits<signature>::FunctionP_Type FunctionP_Type;                        
    };
    
    
    /**分两步定义信号**/
    #define DECLARE_SIGNAL(signal_name,signal_id)                                                        
        enum {signal_name = signal_id};
    
    
    #define VALIDE_SIGNAL(signal_name,signature2)                                                        
                                                                                                        
    template<>                                                                                            
    struct signature_trait<signal_name,traits::function_traits<signature2>::arity>                        
    {                                                                                                    
        typedef traits::function_traits<signature2>::Function_Type Function_Type;                                
        typedef traits::function_traits<signature2>::FunctionP_Type FunctionP_Type;                        
    };
    
    
    
    
    #endif
    //signalcall2.hpp
    #ifndef SIGNALCALL2_INCLUDE
    #define SIGNALCALL2_INCLUDE
    
    #include "signalcall_config2.hpp"
    #include "signal_type2.hpp"
    #include <map>
    #include <list>
    #include <cassert>
    
    NAMESPACE_SIGNALCALL_BEGIN
    
    struct call_list_container
    {
        call_list_container():_func(0),_method(0){}
        callhelper::basic_call_container* _func;
        callhelper::basic_call_container* _method;
    };
    
    typedef std::map<ParamC,call_list_container> param_callcontainer_map;
    typedef std::map<SigID,param_callcontainer_map> sig_paramc_callcontainer_map;
    
    
    class signalcall2
    {
    protected:
        sig_paramc_callcontainer_map _sig_paramc_callcontainer_map;
    
        void _call(SigID id,ParamC c,std::string& str)
        {
            sig_paramc_callcontainer_map::iterator iter = _sig_paramc_callcontainer_map.find(id);
            if (iter!=_sig_paramc_callcontainer_map.end())
            {
                param_callcontainer_map::iterator iter2 = iter->second.find(c);
                if (iter2!=iter->second.end())
                {
                    if (iter2->second._func!=0)
                    {
                        IArchive iarc(str);
                        iter2->second._func->call(iarc);
                    }
                    if (iter2->second._method!=0)
                    {
                        IArchive iarc(str);
                        iter2->second._method->call(iarc);
                    }
                }
            }
    
            return ;
        }
    
        signalcall2(const signalcall2&);
    
        signalcall2& operator =(const signalcall2&);
    
    public:
        signalcall2(){}
    
        virtual ~signalcall2()
        {
            unbindAllSignal();
        }
    
        template<SigID sigID,typename classtype,typename funtype>
        void bindSignal(classtype* obj,funtype fun)
        {
            // 安全检查
            typedef signature_trait<sigID,traits::mfunction_traits<funtype>::arity>::FunctionP_Type _FunctionP_Type;
            typename traits::fun_to_mem_converter<_FunctionP_Type,classtype>::MFunctionP_Type security_check(fun);
    
            typedef callhelper::call_container<std::set<callhelper::call_helper<funtype,classtype> >,funtype,classtype> Call_Container_Type;
    
            sig_paramc_callcontainer_map::iterator iter = _sig_paramc_callcontainer_map.find(sigID);
            if (iter==_sig_paramc_callcontainer_map.end())
            {
                param_callcontainer_map _map;
                _sig_paramc_callcontainer_map[sigID] = _map;
                iter = _sig_paramc_callcontainer_map.find(sigID);
            }
    
            const int count = traits::mfunction_traits<funtype>::arity;
            param_callcontainer_map::iterator iter2 = iter->second.find(count);
            if (iter2==iter->second.end())
            {
                call_list_container c_list_ontainer;
                iter->second[count] = c_list_ontainer;
                iter2 = iter->second.find(count);
            }
    
            if (iter2->second._method==0)
            {
                iter2->second._method = new Call_Container_Type;
            }
    
            callhelper::call_helper<funtype,classtype> c_helper(obj,fun);
            Call_Container_Type& c_container = dynamic_cast<Call_Container_Type&>(*(iter2->second)._method);
            c_container._container.insert(c_helper);
        }
    
        template<SigID sigID,typename funtype>
        void bindSignal(funtype fun)
        {
            // 安全检查
            typename signature_trait<sigID,traits::function_traits<funtype>::arity>::FunctionP_Type security_check(fun);
    
            typedef callhelper::call_container<std::set<callhelper::call_helper<funtype,void> >,funtype,void> Call_Container_Type;
    
            sig_paramc_callcontainer_map::iterator iter = _sig_paramc_callcontainer_map.find(sigID);
            if (iter==_sig_paramc_callcontainer_map.end())
            {
                param_callcontainer_map _map;
                _sig_paramc_callcontainer_map[sigID] = _map;
                iter = _sig_paramc_callcontainer_map.find(sigID);
            }
    
            const int count = traits::function_traits<funtype>::arity;
            param_callcontainer_map::iterator iter2 = iter->second.find(count);
            if (iter2==iter->second.end())
            {
                call_list_container c_list_ontainer;
                iter->second[count] = c_list_ontainer;
                iter2 = iter->second.find(count);
            }
    
            if (iter2->second._func==0)
            {
                iter2->second._func = new Call_Container_Type;
            }
    
            callhelper::call_helper<funtype,void> c_helper(fun);
            Call_Container_Type& c_container = dynamic_cast<Call_Container_Type&>(*(iter2->second)._func);
            c_container._container.insert(c_helper);
        }
    
        template<SigID sigID,typename classtype,typename funtype>
        void unbindSignal(classtype* obj,funtype fun)
        {
            // 安全检查
            typename signature_trait<sigID,traits::function_traits<funtype>::arity>::FunctionP_Type security_check(fun);
    
            sig_paramc_callcontainer_map::iterator iter = _sig_paramc_callcontainer_map.find(sigID);
            if (iter!=_sig_paramc_callcontainer_map.end())
            {
                const int count = traits::mfunction_traits<funtype>::arity;
                param_callcontainer_map::iterator iter2 = iter->second.find(count);
                if (iter2!=iter->second.end())
                {
                    if (iter2->second._method!=0)
                    {
                        typedef callhelper::call_container<std::set<callhelper::call_helper<funtype,classtype> >,funtype,classtype> Call_Container_Type;
                        Call_Container_Type& c_container = (Call_Container_Type&)(*(iter2->second)._method);
    
                        callhelper::call_helper<funtype,classtype> c_helper(obj,fun);
                        c_container._container.erase(c_helper);
    
                        if (c_container._container.size()==0)
                        {
                            delete (iter2->second._method);
                            iter2->second._method = 0;
                        }
                    }
    
                    if (!iter2->second._func && !iter2->second._method)
                    {
                        iter->second.erase(iter2);
                    }
                }
    
                if (iter->second.size()==0)
                {
                    _sig_paramc_callcontainer_map.erase(iter);
                }
            }
        }
    
        template<SigID sigID,typename funtype>
        void unbindSignal(funtype fun)
        {
            // 安全检查
            typename signature_trait<sigID,traits::function_traits<funtype>::arity>::FunctionP_Type security_check(fun);
    
            sig_paramc_callcontainer_map::iterator iter = _sig_paramc_callcontainer_map.find(sigID);
            if (iter!=_sig_paramc_callcontainer_map.end())
            {
                const int count = traits::function_traits<funtype>::arity;
                param_callcontainer_map::iterator iter2 = iter->second.find(count);
                if (iter2!=iter->second.end())
                {
                    if (iter2->second._func!=0)
                    {
                        typedef callhelper::call_container<std::set<callhelper::call_helper<funtype,void> >,funtype,void> Call_Container_Type;
                        Call_Container_Type& c_container = (Call_Container_Type&)(*(iter2->second)._func);
    
                        callhelper::call_helper<funtype,void> c_helper(fun);
                        c_container._container.erase(c_helper);
    
                        if (c_container._container.size()==0)
                        {
                            delete (iter2->second._func);
                            iter2->second._func = 0;
                        }
                    }
    
                    if (!iter2->second._func && !iter2->second._method)
                    {
                        iter->second.erase(iter2);
                    }
                }
    
                if (iter->second.size()==0)
                {
                    _sig_paramc_callcontainer_map.erase(iter);
                }
            }
        }
    
        void unbindAllSignal()
        {
            for (sig_paramc_callcontainer_map::iterator iter=_sig_paramc_callcontainer_map.begin();
                iter!=_sig_paramc_callcontainer_map.end(); ++iter)
            {
                for (param_callcontainer_map::iterator iter2=iter->second.begin();
                    iter2!=iter->second.end(); ++iter2)
                {
                    delete (iter2->second._func);
                    delete (iter2->second._method);
    
                    iter2->second._func = 0;
                    iter2->second._method = 0;
                }
                iter->second.clear();
            }
            _sig_paramc_callcontainer_map.clear();
        }
    
        template<SigID sigID>
        void signal()
        {
            typedef typename signature_trait<sigID,0>::Function_Type Function_Type;
            _call(sigID,0,std::string(""));
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,1>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,1>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,1,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,2>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,2>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,2>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,2>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,2,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,3>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,3>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,3>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,3>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,3>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,3>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,3,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,4>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,4>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,4>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,4>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,4>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,4>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,4>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,4>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,4,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,5>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,5>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,5>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,5>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,5>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,5>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,5>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,5>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,5>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,5>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,5,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,6>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,6>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,6>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,6>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,6>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,6>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,6>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,6>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,6>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,6>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,6>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,6>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,6,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,7>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,7,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg8 p8,
            typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg8>(p8,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,8>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,8,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg9 p9,
            typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg8 p8,
            typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg9>(p9,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg8>(p8,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,9>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,9,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg10 p10,
            typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg9 p9,
            typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg8 p8,
            typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg10>(p10,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg9>(p9,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg8>(p8,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,10>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,10,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg11 p11,
            typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg10 p10,
            typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg9 p9,
            typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg8 p8,
            typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg11>(p11,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg10>(p10,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg9>(p9,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg8>(p8,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,11>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,11,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg12 p12,
            typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg11 p11,
            typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg10 p10,
            typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg9 p9,
            typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg8 p8,
            typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg12>(p12,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg11>(p11,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg10>(p10,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg9>(p9,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg8>(p8,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,12>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,12,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg13 p13,
            typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg12 p12,
            typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg11 p11,
            typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg10 p10,
            typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg9 p9,
            typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg8 p8,
            typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg13>(p13,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg12>(p12,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg11>(p11,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg10>(p10,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg9>(p9,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg8>(p8,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,13>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,13,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg14 p14,
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg13 p13,
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg12 p12,
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg11 p11,
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg10 p10,
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg9 p9,
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg8 p8,
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg14>(p14,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg13>(p13,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg12>(p12,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg11>(p11,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg10>(p10,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg9>(p9,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg8>(p8,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,14>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,14,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg15 p15,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg14 p14,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg13 p13,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg12 p12,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg11 p11,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg10 p10,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg9 p9,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg8 p8,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg15>(p15,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg14>(p14,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg13>(p13,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg12>(p12,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg11>(p11,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg10>(p10,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg9>(p9,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg8>(p8,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,15>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,15,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg16 p16,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg15 p15,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg14 p14,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg13 p13,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg12 p12,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg11 p11,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg10 p10,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg9 p9,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg8 p8,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg16>(p16,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg15>(p15,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg14>(p14,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg13>(p13,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg12>(p12,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg11>(p11,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg10>(p10,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg9>(p9,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg8>(p8,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,16>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,16,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg17 p17,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg16 p16,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg15 p15,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg14 p14,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg13 p13,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg12 p12,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg11 p11,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg10 p10,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg9 p9,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg8 p8,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg17>(p17,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg16>(p16,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg15>(p15,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg14>(p14,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg13>(p13,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg12>(p12,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg11>(p11,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg10>(p10,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg9>(p9,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg8>(p8,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,17>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,17,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg18 p18,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg17 p17,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg16 p16,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg15 p15,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg14 p14,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg13 p13,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg12 p12,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg11 p11,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg10 p10,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg9 p9,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg8 p8,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg18>(p18,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg17>(p17,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg16>(p16,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg15>(p15,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg14>(p14,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg13>(p13,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg12>(p12,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg11>(p11,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg10>(p10,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg9>(p9,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg8>(p8,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,18>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,18,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg19 p19,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg18 p18,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg17 p17,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg16 p16,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg15 p15,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg14 p14,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg13 p13,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg12 p12,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg11 p11,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg10 p10,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg9 p9,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg8 p8,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg19>(p19,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg18>(p18,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg17>(p17,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg16>(p16,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg15>(p15,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg14>(p14,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg13>(p13,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg12>(p12,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg11>(p11,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg10>(p10,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg9>(p9,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg8>(p8,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,19>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,19,str);
        }
    
        template<SigID sigID>
        void signal(
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg20 p20,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg19 p19,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg18 p18,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg17 p17,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg16 p16,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg15 p15,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg14 p14,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg13 p13,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg12 p12,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg11 p11,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg10 p10,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg9 p9,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg8 p8,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg7 p7,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg6 p6,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg5 p5,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg4 p4,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg3 p3,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg2 p2,
            typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg1 p1
            )
        {
            std::string str;
            OArchive oarc(str);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg20>(p20,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg19>(p19,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg18>(p18,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg17>(p17,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg16>(p16,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg15>(p15,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg14>(p14,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg13>(p13,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg12>(p12,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg11>(p11,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg10>(p10,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg9>(p9,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg8>(p8,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg7>(p7,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg6>(p6,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg5>(p5,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg4>(p4,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg3>(p3,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg2>(p2,oarc);
            callhelper::param_set<typename traits::function_traits<typename signature_trait<sigID,20>::Function_Type>::arg1>(p1,oarc);
    
            _call(sigID,20,str);
        }
    };
    
    
    
    
    NAMESPACE_SIGNALCALL_END
    #endif
  • 相关阅读:
    解决Struts中文乱码问题总结
    也谈创业企业CEO该拿多少工资
    Codeforces Round #242 (Div. 2) A. Squats
    设计模式之模板方法模式
    hdu2768Cat vs. Dog (反建法,最大独立集)
    Python
    kvm
    linux bin文件制作
    python
    pytho
  • 原文地址:https://www.cnblogs.com/openlib/p/5346694.html
Copyright © 2011-2022 走看看