Program Listing for File Delegate.hpp

Return to documentation for file (include/ari/Delegate.hpp)

#pragma once

namespace ari
{
    template <class Treturn>
    class DelegateNoParam
    {
        class BaseFuncNoParam
        {
        public:
            virtual ~BaseFuncNoParam() = default;

            virtual Treturn Call() = 0;
        };

        template <class Tclass>
        class MemFuncNoParam : public BaseFuncNoParam
        {
        public:

            MemFuncNoParam(Tclass* _obj, Treturn(Tclass::*_fun)()) : m_pObj(_obj), m_pFun(_fun) {}

            Treturn Call() override
            {
                return (*m_pObj.*m_pFun)();
            }

        protected:

            Tclass  *   m_pObj;
            Treturn(Tclass::*m_pFun)();
        };

    public:

        DelegateNoParam() : m_pFun(nullptr), m_pMemFun(nullptr) { }

        ~DelegateNoParam()
        {
            delete m_pMemFun;
        }

        void Bind(Treturn(*_fun)()) { m_pFun = _fun; }

        template <class Tclass>
        void Bind(Tclass* _obj, Treturn(Tclass::*_fun)())
        {
            m_pMemFun = new MemFuncNoParam<Tclass>(_obj, _fun);
        }

        bool IsBound() { return m_pFun || m_pMemFun; }

        Treturn Execute()
        {
            if (m_pFun)
                return m_pFun();
            if (m_pMemFun)
                return m_pMemFun->Call();
        }

    protected:
        Treturn(*m_pFun)();
        BaseFuncNoParam *   m_pMemFun;
    };



    template <class Treturn, class Targ1>
    class DelegateOneParam
    {
        class BaseFuncOneParam
        {
        public:
            virtual ~BaseFuncOneParam() = default;

            virtual Treturn Call(Targ1 arg1) = 0;
        };

        template <class Tclass>
        class MemFuncOneParam : public BaseFuncOneParam
        {
        public:

            MemFuncOneParam(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1)) : m_pObj(_obj), m_pFun(_fun) {}

            Treturn Call(Targ1 arg1) override
            {
                return (*m_pObj.*m_pFun)(arg1);
            }

        protected:

            Tclass  *   m_pObj;
            Treturn(Tclass::*m_pFun)(Targ1);
        };

    public:

        DelegateOneParam() : m_pFun(nullptr), m_pMemFun(nullptr) { }

        ~DelegateOneParam()
        {
            delete m_pMemFun;
        }

        void Bind(Treturn(*_fun)(Targ1)) { m_pFun = _fun; }

        template <class Tclass>
        void Bind(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1))
        {
            m_pMemFun = new MemFuncOneParam<Tclass>(_obj, _fun);
        }

        bool IsBound() { return m_pFun || m_pMemFun; }

        Treturn Execute(Targ1 arg1)
        {
            if (m_pFun)
                return m_pFun(arg1);
            if (m_pMemFun)
                return m_pMemFun->Call(arg1);
        }

    protected:
        Treturn(*m_pFun)(Targ1);
        BaseFuncOneParam    *   m_pMemFun;
    };



    template <class Treturn, class Targ1, class Targ2>
    class DelegateTwoParam
    {
        class BaseFuncTwoParam
        {
        public:
            virtual ~BaseFuncTwoParam() = default;

            virtual Treturn Call(Targ1 arg1, Targ2 arg2) = 0;
        };

        template <class Tclass>
        class MemFuncTwoParam : public BaseFuncTwoParam
        {
        public:

            MemFuncTwoParam(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2)) : m_pObj(_obj), m_pFun(_fun) {}

            Treturn Call(Targ1 arg1, Targ2 arg2) override
            {
                return (*m_pObj.*m_pFun)(arg1, arg2);
            }

        protected:

            Tclass  *   m_pObj;
            Treturn(Tclass::*m_pFun)(Targ1, Targ2);
        };

    public:

        DelegateTwoParam() : m_pFun(nullptr), m_pMemFun(nullptr) { }

        ~DelegateTwoParam()
        {
            delete m_pMemFun;
        }

        void Bind(Treturn(*_fun)(Targ1, Targ2)) { m_pFun = _fun; }

        template <class Tclass>
        void Bind(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2))
        {
            m_pMemFun = new MemFuncTwoParam<Tclass>(_obj, _fun);
        }

        bool IsBound() { return m_pFun || m_pMemFun; }

        Treturn Execute(Targ1 arg1, Targ2 arg2)
        {
            if (m_pFun)
                return m_pFun(arg1, arg2);
            if (m_pMemFun)
                return m_pMemFun->Call(arg1, arg2);
        }

    protected:
        Treturn(*m_pFun)(Targ1, Targ2);
        BaseFuncTwoParam    *   m_pMemFun;
    };



    template <class Treturn, class Targ1, class Targ2, class Targ3>
    class DelegateThreeParam
    {
        class BaseFuncThreeParam
        {
        public:
            virtual ~BaseFuncThreeParam() = default;

            virtual Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3) = 0;
        };

        template <class Tclass>
        class MemFuncThreeParam : public BaseFuncThreeParam
        {
        public:

            MemFuncThreeParam(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3)) : m_pObj(_obj), m_pFun(_fun) {}

            Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3) override
            {
                return (*m_pObj.*m_pFun)(arg1, arg2, arg3);
            }

        protected:

            Tclass  *   m_pObj;
            Treturn(Tclass::*m_pFun)(Targ1, Targ2, Targ3);
        };

    public:

        DelegateThreeParam() : m_pFun(nullptr), m_pMemFun(nullptr) { }

        ~DelegateThreeParam()
        {
            delete m_pMemFun;
        }

        void Bind(Treturn(*_fun)(Targ1, Targ2, Targ3)) { m_pFun = _fun; }

        template <class Tclass>
        void Bind(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3))
        {
            m_pMemFun = new MemFuncThreeParam<Tclass>(_obj, _fun);
        }

        bool IsBound() { return m_pFun || m_pMemFun; }

        Treturn Execute(Targ1 arg1, Targ2 arg2, Targ3 arg3)
        {
            if (m_pFun)
                return m_pFun(arg1, arg2, arg3);
            if (m_pMemFun)
                return m_pMemFun->Call(arg1, arg2, arg3);
        }

    protected:
        Treturn(*m_pFun)(Targ1, Targ2, Targ3);
        BaseFuncThreeParam  *   m_pMemFun;
    };



    template <class Treturn, class Targ1, class Targ2, class Targ3, class Targ4>
    class DelegateFourParam
    {
        class BaseFuncFourParam
        {
        public:
            virtual ~BaseFuncFourParam() = default;

            virtual Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4) = 0;
        };

        template <class Tclass>
        class MemFuncFourParam : public BaseFuncFourParam
        {
        public:

            MemFuncFourParam(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4)) : m_pObj(_obj), m_pFun(_fun) {}

            Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4) override
            {
                return (*m_pObj.*m_pFun)(arg1, arg2, arg3, arg4);
            }

        protected:

            Tclass  *   m_pObj;
            Treturn(Tclass::*m_pFun)(Targ1, Targ2, Targ3, Targ4);
        };

    public:

        DelegateFourParam() : m_pFun(nullptr), m_pMemFun(nullptr) { }

        ~DelegateFourParam()
        {
            delete m_pMemFun;
        }

        void Bind(Treturn(*_fun)(Targ1, Targ2, Targ3, Targ4)) { m_pFun = _fun; }

        template <class Tclass>
        void Bind(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4))
        {
            m_pMemFun = new MemFuncFourParam<Tclass>(_obj, _fun);
        }

        bool IsBound() { return m_pFun || m_pMemFun; }

        Treturn Execute(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4)
        {
            if (m_pFun)
                return m_pFun(arg1, arg2, arg3, arg4);
            if (m_pMemFun)
                return m_pMemFun->Call(arg1, arg2, arg3, arg4);
        }

    protected:
        Treturn(*m_pFun)(Targ1, Targ2, Targ3, Targ4);
        BaseFuncFourParam   *   m_pMemFun;
    };



    template <class Treturn, class Targ1, class Targ2, class Targ3, class Targ4, class Targ5>
    class DelegateFiveParam
    {
        class BaseFuncFiveParam
        {
        public:
            virtual ~BaseFuncFiveParam() = default;

            virtual Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5) = 0;
        };

        template <class Tclass>
        class MemFuncFiveParam : public BaseFuncFiveParam
        {
        public:

            MemFuncFiveParam(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5)) : m_pObj(_obj), m_pFun(_fun) {}

            Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5) override
            {
                return (*m_pObj.*m_pFun)(arg1, arg2, arg3, arg4, arg5);
            }

        protected:

            Tclass  *   m_pObj;
            Treturn(Tclass::*m_pFun)(Targ1, Targ2, Targ3, Targ4, Targ5);
        };

    public:

        DelegateFiveParam() : m_pFun(nullptr), m_pMemFun(nullptr) { }

        ~DelegateFiveParam()
        {
            delete m_pMemFun;
        }

        void Bind(Treturn(*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5)) { m_pFun = _fun; }

        template <class Tclass>
        void Bind(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5))
        {
            m_pMemFun = new MemFuncFiveParam<Tclass>(_obj, _fun);
        }

        bool IsBound() { return m_pFun || m_pMemFun; }

        Treturn Execute(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5)
        {
            if (m_pFun)
                return m_pFun(arg1, arg2, arg3, arg4, arg5);
            if (m_pMemFun)
                return m_pMemFun->Call(arg1, arg2, arg3, arg4, arg5);
        }

    protected:
        Treturn(*m_pFun)(Targ1, Targ2, Targ3, Targ4, Targ5);
        BaseFuncFiveParam   *   m_pMemFun;
    };



    template <class Treturn, class Targ1, class Targ2, class Targ3, class Targ4, class Targ5, class Targ6>
    class DelegateSixParam
    {
        class BaseFuncSixParam
        {
        public:
            virtual ~BaseFuncSixParam() = default;

            virtual Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6) = 0;
        };

        template <class Tclass>
        class MemFuncSixParam : public BaseFuncSixParam
        {
        public:

            MemFuncSixParam(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6)) : m_pObj(_obj), m_pFun(_fun) {}

            Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6) override
            {
                return (*m_pObj.*m_pFun)(arg1, arg2, arg3, arg4, arg5, arg6);
            }

        protected:

            Tclass  *   m_pObj;
            Treturn(Tclass::*m_pFun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6);
        };

    public:

        DelegateSixParam() : m_pFun(nullptr), m_pMemFun(nullptr) { }

        ~DelegateSixParam()
        {
            delete m_pMemFun;
        }

        void Bind(Treturn(*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6)) { m_pFun = _fun; }

        template <class Tclass>
        void Bind(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6))
        {
            m_pMemFun = new MemFuncSixParam<Tclass>(_obj, _fun);
        }

        bool IsBound() { return m_pFun || m_pMemFun; }

        Treturn Execute(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6)
        {
            if (m_pFun)
                return m_pFun(arg1, arg2, arg3, arg4, arg5, arg6);
            if (m_pMemFun)
                return m_pMemFun->Call(arg1, arg2, arg3, arg4, arg5, arg6);
        }

    protected:
        Treturn(*m_pFun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6);
        BaseFuncSixParam    *   m_pMemFun;
    };



    template <class Treturn, class Targ1, class Targ2, class Targ3, class Targ4, class Targ5, class Targ6, class Targ7>
    class DelegateSevenParam
    {
        class BaseFuncSevenParam
        {
        public:
            virtual ~BaseFuncSevenParam() = default;

            virtual Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7) = 0;
        };

        template <class Tclass>
        class MemFuncSevenParam : public BaseFuncSevenParam
        {
        public:

            MemFuncSevenParam(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7)) : m_pObj(_obj), m_pFun(_fun) {}

            Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7) override
            {
                return (*m_pObj.*m_pFun)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
            }

        protected:

            Tclass  *   m_pObj;
            Treturn(Tclass::*m_pFun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7);
        };

    public:

        DelegateSevenParam() : m_pFun(nullptr), m_pMemFun(nullptr) { }

        ~DelegateSevenParam()
        {
            delete m_pMemFun;
        }

        void Bind(Treturn(*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7)) { m_pFun = _fun; }

        template <class Tclass>
        void Bind(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7))
        {
            m_pMemFun = new MemFuncSevenParam<Tclass>(_obj, _fun);
        }

        bool IsBound() { return m_pFun || m_pMemFun; }

        Treturn Execute(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7)
        {
            if (m_pFun)
                return m_pFun(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
            if (m_pMemFun)
                return m_pMemFun->Call(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
        }

    protected:
        Treturn(*m_pFun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7);
        BaseFuncSevenParam  *   m_pMemFun;
    };



    template <class Treturn, class Targ1, class Targ2, class Targ3, class Targ4, class Targ5, class Targ6, class Targ7, class Targ8>
    class DelegateEightParam
    {
        class BaseFuncEightParam
        {
        public:
            virtual ~BaseFuncEightParam() = default;

            virtual Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 arg8) = 0;
        };

        template <class Tclass>
        class MemFuncEightParam : public BaseFuncEightParam
        {
        public:

            MemFuncEightParam(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8)) : m_pObj(_obj), m_pFun(_fun) {}

            Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 arg8) override
            {
                return (*m_pObj.*m_pFun)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
            }

        protected:

            Tclass  *   m_pObj;
            Treturn(Tclass::*m_pFun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8);
        };

    public:

        DelegateEightParam() : m_pFun(nullptr), m_pMemFun(nullptr) { }

        ~DelegateEightParam()
        {
            delete m_pMemFun;
        }

        void Bind(Treturn(*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8)) { m_pFun = _fun; }

        template <class Tclass>
        void Bind(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8))
        {
            m_pMemFun = new MemFuncEightParam<Tclass>(_obj, _fun);
        }

        bool IsBound() { return m_pFun || m_pMemFun; }

        Treturn Execute(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 arg8)
        {
            if (m_pFun)
                return m_pFun(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
            if (m_pMemFun)
                return m_pMemFun->Call(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
        }

    protected:
        Treturn(*m_pFun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8);
        BaseFuncEightParam  *   m_pMemFun;
    };



    template <class Treturn, class Targ1, class Targ2, class Targ3, class Targ4, class Targ5, class Targ6, class Targ7, class Targ8, class Targ9>
    class DelegateNineParam
    {
        class BaseFuncNineParam
        {
        public:
            virtual ~BaseFuncNineParam() = default;

            virtual Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 arg8, Targ9 arg9) = 0;
        };

        template <class Tclass>
        class MemFuncNineParam : public BaseFuncNineParam
        {
        public:

            MemFuncNineParam(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9)) : m_pObj(_obj), m_pFun(_fun) {}

            Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 arg8, Targ9 arg9) override
            {
                return (*m_pObj.*m_pFun)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
            }

        protected:

            Tclass  *   m_pObj;
            Treturn(Tclass::*m_pFun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9);
        };

    public:

        DelegateNineParam() : m_pFun(nullptr), m_pMemFun(nullptr) { }

        ~DelegateNineParam()
        {
            delete m_pMemFun;
        }

        void Bind(Treturn(*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9)) { m_pFun = _fun; }

        template <class Tclass>
        void Bind(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9))
        {
            m_pMemFun = new MemFuncNineParam<Tclass>(_obj, _fun);
        }

        bool IsBound() { return m_pFun || m_pMemFun; }

        Treturn Execute(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 arg8, Targ9 arg9)
        {
            if (m_pFun)
                return m_pFun(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
            if (m_pMemFun)
                return m_pMemFun->Call(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
        }

    protected:
        Treturn(*m_pFun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9);
        BaseFuncNineParam   *   m_pMemFun;
    };



    template <class Treturn, class Targ1, class Targ2, class Targ3, class Targ4, class Targ5, class Targ6, class Targ7, class Targ8, class Targ9, class Targ10>
    class DelegateTenParam
    {
        class BaseFuncTenParam
        {
        public:
            virtual ~BaseFuncTenParam() = default;

            virtual Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 arg8, Targ9 arg9, Targ10 arg10) = 0;
        };

        template <class Tclass>
        class MemFuncTenParam : public BaseFuncTenParam
        {
        public:

            MemFuncTenParam(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9, Targ10)) : m_pObj(_obj), m_pFun(_fun) {}

            Treturn Call(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 arg8, Targ9 arg9, Targ10 arg10) override
            {
                return (*m_pObj.*m_pFun)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
            }

        protected:

            Tclass  *   m_pObj;
            Treturn(Tclass::*m_pFun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9, Targ10);
        };

    public:

        DelegateTenParam() : m_pFun(nullptr), m_pMemFun(nullptr) { }

        ~DelegateTenParam()
        {
            delete m_pMemFun;
        }

        void Bind(Treturn(*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9, Targ10)) { m_pFun = _fun; }

        template <class Tclass>
        void Bind(Tclass* _obj, Treturn(Tclass::*_fun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9, Targ10))
        {
            m_pMemFun = new MemFuncTenParam<Tclass>(_obj, _fun);
        }

        bool IsBound() { return m_pFun || m_pMemFun; }

        Treturn Execute(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 arg8, Targ9 arg9, Targ10 arg10)
        {
            if (m_pFun)
                return m_pFun(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
            if (m_pMemFun)
                return m_pMemFun->Call(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
        }

    protected:
        Treturn(*m_pFun)(Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9, Targ10);
        BaseFuncTenParam    *   m_pMemFun;
    };



}