⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memberfunctiondcl.hpp

📁 一个实现C++反射机制的类库
💻 HPP
字号:
/******************************************************************************\
*                                                                              *
*   MemberFunctionDcl.hpp                                                      *
*                                                                              *
*   <Purpose of this file>                                                     *
*                                                                              *
\******************************************************************************/

// $Id: MemberFunctionDcl.hpp,v 1.1 2007/10/25 14:05:25 tdevadit Exp $



#ifndef REFLCPP_MEMBER_FUNCTION_DCL_HPP
#define REFLCPP_MEMBER_FUNCTION_DCL_HPP



#include <reflcpp/Type.hpp>
#include <reflcpp/ClassType_tmpl.hpp>
#include <reflcpp/ClassType.hpp>
#include <reflcpp/FundamentalType.hpp>
#include <reflcpp/BoundClassType_tmpl.hpp>
#include <reflcpp/TypeInfoCmp.hpp>
#include <reflcpp/check.hpp>
#include <reflcpp/RetValHolder.hpp>
#include <reflcpp/Traits.hpp>



namespace reflcpp {


/*-----------------------------------------------------------------------------\
|------------------------------------------------------------------------------|
|                                                                              |
|   MemberFunctionDcl                                                          |
|                                                                              |
|------------------------------------------------------------------------------|
\------------------------------------------------------------------------------/

    <Class comments>

-                                                                             */

template <typename Obj_TP, typename Ret_TP,
    typename Ret_TP::type (Obj_TP::*FuncP)(), 
    const char *Name>
class MemberFunctionDcl000 : public MemberFunction_body_tmpl3<Obj_TP, Ret_TP> {
    public:
        MemberFunctionDcl000() : MemberFunction_body_tmpl3<Obj_TP, Ret_TP>(Name) { }
        virtual typename Ret_TP::type invoke3(Obj_TP *op, const int n, Arguments &args) const {
            assert(n == 0);
            return (op->*FuncP)();
        }
};

template <typename Obj_TP, typename Ret_TP, 
    typename Arg1_TP,
    typename Ret_TP::type (Obj_TP::*FuncP)(typename Arg1_TP::type), 
    const char *Name>
class MemberFunctionDcl001 : public MemberFunction_body_tmpl3<Obj_TP, Ret_TP> {
    public:
        MemberFunctionDcl001() : MemberFunction_body_tmpl3<Obj_TP, Ret_TP>(Name) { 
            registerArgument(&arg1);
        }
        virtual typename Ret_TP::type invoke3(Obj_TP *op, const int n, Arguments &args) const {
            assert(n == 1);
            PtrHolder_tmpl<typename TypeOp<typename Arg1_TP::type>::BareT> &arg1_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg1_TP::type>::BareT> &>(*(args[0]));
            return (op->*FuncP)(*(arg1_t.ptr));
        }
    protected:
        Arg1_TP arg1;
};

template <typename Obj_TP, typename Ret_TP, 
    typename Arg1_TP, typename Arg2_TP,
    typename Ret_TP::type (Obj_TP::*FuncP)(typename Arg1_TP::type, typename Arg2_TP::type), 
    const char *Name>
class MemberFunctionDcl002 : public MemberFunction_body_tmpl3<Obj_TP, Ret_TP> {
    public:
        MemberFunctionDcl002() : MemberFunction_body_tmpl3<Obj_TP, Ret_TP>(Name) { 
            registerArgument(&arg1);
            registerArgument(&arg2);
        }
        virtual typename Ret_TP::type invoke3(Obj_TP *op, const int n, Arguments &args) const {
            assert(n == 2);
            PtrHolder_tmpl<typename TypeOp<typename Arg1_TP::type>::BareT> &arg1_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg1_TP::type>::BareT> &>(*(args[0]));
            PtrHolder_tmpl<typename TypeOp<typename Arg2_TP::type>::BareT> &arg2_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg2_TP::type>::BareT> &>((*args[1]));
            return (op->*FuncP)(*(arg1_t.ptr), *(arg2_t.ptr));
        }
    protected:
        Arg1_TP arg1;
        Arg2_TP arg2;
};

template <typename Obj_TP, typename Ret_TP, 
    typename Arg1_TP, typename Arg2_TP, typename Arg3_TP,
    typename Ret_TP::type (Obj_TP::*FuncP)(typename Arg1_TP::type, typename Arg2_TP::type, typename Arg3_TP::type), 
    const char *Name>
class MemberFunctionDcl003 : public MemberFunction_body_tmpl3<Obj_TP, Ret_TP> {
    public:
        MemberFunctionDcl003() : MemberFunction_body_tmpl3<Obj_TP, Ret_TP>(Name) { 
            registerArgument(&arg1);
            registerArgument(&arg2);
            registerArgument(&arg3);
        }
        virtual typename Ret_TP::type invoke3(Obj_TP *op, const int n, Arguments &args) const {
            assert(n == 3);
            PtrHolder_tmpl<typename TypeOp<typename Arg1_TP::type>::BareT> &arg1_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg1_TP::type>::BareT> &>(*(args[0]));
            PtrHolder_tmpl<typename TypeOp<typename Arg2_TP::type>::BareT> &arg2_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg2_TP::type>::BareT> &>((*args[1]));
            PtrHolder_tmpl<typename TypeOp<typename Arg3_TP::type>::BareT> &arg3_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg3_TP::type>::BareT> &>((*args[2]));
            return (op->*FuncP)(*(arg1_t.ptr), *(arg2_t.ptr), *(arg3_t.ptr));
        }
    protected:
        Arg1_TP arg1;
        Arg2_TP arg2;
        Arg3_TP arg3;
};

template <typename Obj_TP, typename Ret_TP, 
    typename Arg1_TP, typename Arg2_TP, typename Arg3_TP, typename Arg4_TP,
    typename Ret_TP::type (Obj_TP::*FuncP)(typename Arg1_TP::type, typename Arg2_TP::type, typename Arg3_TP::type, typename Arg4_TP::type), 
    const char *Name>
class MemberFunctionDcl004 : public MemberFunction_body_tmpl3<Obj_TP, Ret_TP> {
    public:
        MemberFunctionDcl004() : MemberFunction_body_tmpl3<Obj_TP, Ret_TP>(Name) { 
            registerArgument(&arg1);
            registerArgument(&arg2);
            registerArgument(&arg3);
            registerArgument(&arg4);
        }
        virtual typename Ret_TP::type invoke3(Obj_TP *op, const int n, Arguments &args) const {
            assert(n == 4);
            PtrHolder_tmpl<typename TypeOp<typename Arg1_TP::type>::BareT> &arg1_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg1_TP::type>::BareT> &>(*(args[0]));
            PtrHolder_tmpl<typename TypeOp<typename Arg2_TP::type>::BareT> &arg2_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg2_TP::type>::BareT> &>((*args[1]));
            PtrHolder_tmpl<typename TypeOp<typename Arg3_TP::type>::BareT> &arg3_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg3_TP::type>::BareT> &>((*args[2]));
            PtrHolder_tmpl<typename TypeOp<typename Arg4_TP::type>::BareT> &arg4_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg4_TP::type>::BareT> &>((*args[3]));
            return (op->*FuncP)(*(arg1_t.ptr), *(arg2_t.ptr), *(arg3_t.ptr), *(arg4_t.ptr));
        }
    protected:
        Arg1_TP arg1;
        Arg2_TP arg2;
        Arg3_TP arg3;
        Arg4_TP arg4;
};

template <typename Obj_TP, typename Ret_TP, 
    typename Arg1_TP, typename Arg2_TP, typename Arg3_TP, typename Arg4_TP, typename Arg5_TP,
    typename Ret_TP::type (Obj_TP::*FuncP)(typename Arg1_TP::type, typename Arg2_TP::type, typename Arg3_TP::type, typename Arg4_TP::type, typename Arg5_TP::type), 
    const char *Name>
class MemberFunctionDcl005 : public MemberFunction_body_tmpl3<Obj_TP, Ret_TP> {
    public:
        MemberFunctionDcl005() : MemberFunction_body_tmpl3<Obj_TP, Ret_TP>(Name) { 
            registerArgument(&arg1);
            registerArgument(&arg2);
            registerArgument(&arg3);
            registerArgument(&arg4);
            registerArgument(&arg5);
        }
        virtual typename Ret_TP::type invoke3(Obj_TP *op, const int n, Arguments &args) const {
            assert(n == 5);
            PtrHolder_tmpl<typename TypeOp<typename Arg1_TP::type>::BareT> &arg1_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg1_TP::type>::BareT> &>(*(args[0]));
            PtrHolder_tmpl<typename TypeOp<typename Arg2_TP::type>::BareT> &arg2_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg2_TP::type>::BareT> &>((*args[1]));
            PtrHolder_tmpl<typename TypeOp<typename Arg3_TP::type>::BareT> &arg3_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg3_TP::type>::BareT> &>((*args[2]));
            PtrHolder_tmpl<typename TypeOp<typename Arg4_TP::type>::BareT> &arg4_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg4_TP::type>::BareT> &>((*args[3]));
            PtrHolder_tmpl<typename TypeOp<typename Arg5_TP::type>::BareT> &arg5_t
                = dynamic_cast<PtrHolder_tmpl<typename TypeOp<typename Arg5_TP::type>::BareT> &>((*args[4]));
            return (op->*FuncP)(*(arg1_t.ptr), *(arg2_t.ptr), *(arg3_t.ptr), *(arg4_t.ptr), *(arg5_t.ptr));
        }
    protected:
        Arg1_TP arg1;
        Arg2_TP arg2;
        Arg3_TP arg3;
        Arg4_TP arg4;
        Arg5_TP arg5;
};


static const char MemberFunctionDcl_hpp_id[] =
"$Id: MemberFunctionDcl.hpp,v 1.1 2007/10/25 14:05:25 tdevadit Exp $";


} // namespace



#endif



/* Local Variables: */
/* c-basic-offset: 4 */
/* indent-tabs-mode: nil */
/* End: */
/* vim: set filetype=cpp tabstop=8 shiftwidth=4 softtabstop=4 expandtab: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -