C++反射类和成员函数的实现
来源:互联网 发布:全国高校名单数据库 编辑:程序博客网 时间:2024/06/08 12:03
原文地址: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 0
- C++反射类和成员函数的实现
- 反射(成员变量Field和成员函数Method的反射)
- java反射:获取类的成员变量和构造函数
- 使用java反射操作类的构造函数,成员变量和成员方法
- 通过反射获取类对象的成员函数、成员变量(只获取成员函数)、构造函数
- C++:类的成员函数
- C++Pirmer 类的成员函数和重载
- Java反射---Class对象,获得类的方法、成员变量和构造函数信息
- C++:对象数组、对象动态申请和释放、类的定义和实现分开、this指针、常成员函数、时钟
- C++类成员反射实现
- 【C++】类的静态成员函数和静态成员变量的使用
- [NET]Net中的反射使用入门(根据类名和函数名,生成和调用对象的成员函数)
- [NET]Net中的反射使用入门(根据类名和函数名,生成和调用对象的成员函数) .
- C++——类数据成员和类成员函数
- 类的成员函数和普通成员函数的区别
- c++static数据成员和成员函数
- Java反射打印类的信息,包括类的成员函数、成员变量(只获取成员函数)
- 什么是类的成员函数和非成员函数
- 排序之直接选择排序
- js的单元格颜色间隔
- ant的简单使用
- session和cookie的最深刻理解
- 利用ASP打造网站论坛DIY
- C++反射类和成员函数的实现
- Net可能将支持Linux
- 2014年编程之美初赛第一场-焦距
- 08.2:实现Time类中的运算符重载
- C# .net 如何抓取网页内容
- javascrip操作下拉选框
- 【patterns】代理模式
- Settings(设置)
- 关于本博客的一些说明