C++反射类和成员函数的实现

原文地址:http://blog.wangziliang.com/2012/12/28/c%E5%8F%8D%E5%B0%84%E5%87%BD%E6%95%B0%E5%92%8C%E7%B1%BB%E7%9A%84%E5%AE%9E%E7%8E%B0/

C++反射类和成员函数的实现,需要用到STL标准模板库

//定义反射工厂类以及基类NSObject
#ifndef __NS_OBJECT_FACTORYE_H__
#define __NS_OBJECT_FACTORYE_H__
 
#include <map>
#include <string>
 
 
typedef void* (*SEL)(void);
typedef SEL (*callFuc)(void);
 
class NSObject{
public:
    Base(){};
    ~Base(){};
};
 
struct NSObjectFactory {
 
    typedef std::map<std::string, NSObject*(*)()> map_type;
    typedef std::map<std::string, callFuc> fuc_map_type;
 
private:
 
    static map_type * m_map;
    static fuc_map_type * fuc_map;
 
protected:
 
public:
 
    static NSObject * createInstance(std::string const& s){
        map_type::iterator it = getMap()->find(s);
        if(it == getMap()->end())
            return 0;
        return it->second();
    }
  
    static SEL callFaction(std::string const& s) {
        fuc_map_type::iterator it = getFunctionMap()->find(s);
        if(it == getFunctionMap()->end())
            return 0;
        return it->second();
  
    }
 
    static map_type * getMap(){
        // never delete'ed. (exist until program termination)
        // because we can't guarantee correct destruction order 
        if(!m_map) { m_map = new map_type; } 
        return m_map;
    }
 
    static fuc_map_type* getFunctionMap() {
  
        if(!fuc_map) { fuc_map = new fuc_map_type(); } 
  
        return fuc_map; 
  
    }
     
};
 
NSObjectFactory::map_type * NSObjectFactory::m_map = 0;
 
NSObjectFactory::fuc_map_type * NSObjectFactory::fuc_map = 0;
 
template<typename T> NSObject * createT() { return (NSObject *)(new T); }
 
 
template<typename T>
struct NSObjectRegister : NSObjectFactory { 
    NSObjectRegister(std::string const& s) { 
        getMap()->insert(std::make_pair(s, &createT<T>));
    }
};
 
#define REFECTION_CLASS_IMPLEMENT_DEFINE(NAME) \
    virtual string toString(){return #NAME;}; \
    static NSObjectRegister<NAME> registerNSObject
 
#define REFECTION_CLASS_IMPLEMENT(NAME) \
    NSObjectRegister<NAME> NAME::registerNSObject(#NAME)
 
#define NSClassFromString(NAME) \
    NSObjectFactory::createInstance(NAME)
 
struct FuctionRegister : NSObjectFactory { 
    FuctionRegister(std::string const& s, callFuc f) { 
        getFunctionMap()->insert(std::make_pair(s, f));
    }
  
};
  
#define REFECTION_FUNCTION_IMPLEMENT(NAME) \
    static FuctionRegister* f_reg_##NAME = new FuctionRegister(#NAME, (callFuc)NAME)
 
#define NSSelectorFromString(NAME) \
    NSObjectFactory::callFaction(NAME)
 
#endif // __NS_OBJECT_FACTORYE_H__

//===============================================

//示例封装成员函数反射方法定义一个base类
#define __EJ_GET_POINTER_TO(NAME) \
    SEL _ptr_to_##NAME() { \
        return (SEL)NAME; \
    } \
    REFECTION_FUNCTION_IMPLEMENT(_ptr_to_##NAME);
 
#define EJ_BIND_FUNCTION_DEFINE(NAME, ARGC_NAME, ARGV_NAME) \
    int _func_##NAME(size_t ARGC_NAME, const char* ARGV_NAME)
 
#define EJ_BIND_FUNCTION(CLASS, NAME, ARGC_NAME, ARGV_NAME) \
    \
    static int _##CLASS##_func_##NAME( \
        Base* object, \
        size_t argc, \
        const char argv[] \
    ) { \
        CLASS* instance = (CLASS*)object; \
        int ret = instance->_func_##NAME(argc, argv); \
        return ret; \
    } \
    __EJ_GET_POINTER_TO(_##CLASS##_func_##NAME)\
    \
    /* The actual implementation for this method */ \
    int CLASS::_func_##NAME(size_t ARGC_NAME, const char* ARGV_NAME)
 
class Base: public NSObject {
public:
    Base();
    ~Base();
    REFECTION_CLASS_IMPLEMENT_DEFINE(Base);//反射类申明
 
    EJ_BIND_FUNCTION(EJBindingEjectaCore,include, argc, argv )//反射成员函数申明
};
 
REFECTION_CLASS_IMPLEMENT(Base);//反射类实现
 
//反射成员函数类申明
EJ_BIND_FUNCTION(EJBindingEjectaCore,include, argc, argv ) {
    if( argc < 1 ) { return -1; }
    return 1;
}

//===========================================

//使用方法
typedef int (*CALL_BACK)( Base* object,  size_t argc,  const char argv[] );
 
int main(){
  
    NSObject* object = NSClassFromString("Base");//获得反射对象
    SEL callback = NSSelectorFromString("_ptr_to__Base_func_include");//获得函数指针
    ((CALL_BACK)callback)((Base*)object, 0, NULL);//调用静态函数使其调用object对象的成员函数
    return 0;
  
}


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
C++中,HashMap通常是通过使用std::unordered_map实现的。引用中的代码展示了一个简单的例子,其中使用了std::unordered_map来存储成员函数指针。在这个例子中,Test定义了两个成员函数a和b,并且使用了std::unordered_map来存储这些成员函数指针。可以通过调用对应的函数指针来执行不同的函数。例如,可以使用(test.*ptr)()来调用函数a,或者使用(test.*test.funcList.at("b"))()来调用函数b。 需要注意的是,HashMap的键型需要提供一个公共的hashCode()函数和operator==()运算符重载函数,以便在HashMap中进行哈希和比较操作。引用提供了这样的说明。 另外,如果你需要查看HashMap的具体实现,可以参考引用中提供的HashMap的源码。该源码还提供了LinkedHashMap和HashSet的实现细节,如果你对这些数据结构有兴趣,可以进行进一步的学习。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++成员函数模拟实现反射](https://blog.csdn.net/weixin_38693938/article/details/108526990)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++实现 HashMap LinkedHashMap HashSet 源码 效率极高 图解 完全本人手写 带效率测试源码](https://blog.csdn.net/MadokaW/article/details/126378469)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值