C++实现反射机制

来源:互联网 发布:php 获取ip和端口号 编辑:程序博客网 时间:2024/05/17 08:43
#include "stdafx.h"#include <cstdio>#include <string>#include <cstring>#include <map>#include <iostream>using namespace std;#define IMPL_CLASS_CREATE(class_name) \static base* CreateClass##class_name(){ \return new class_name;             \};#define DECLARE_CLASS_CREATE(class_name) \static base* CreateClass##class_name();class base{public:base(){}virtual ~base(){}};class A : public base{public:A(){std::cout<< "A" << endl;}};class B : public base{public:B(){std::cout<< "B" << endl;}};class C : public base{public:C(){std::cout<< "C" << endl;}};IMPL_CLASS_CREATE(A);//声明类的Create函数IMPL_CLASS_CREATE(B);IMPL_CLASS_CREATE(C);
//定义Create函数指针typedef base* (*CreateClass)();#define CREATE_CLASS(_msgCall) (CreateClass)(&_msgCall)
//反射机制中的表static std::map<std::string, CreateClass> CreateList;class Factory{public:static void registerClass(std::string var, CreateClass fun){CreateList[var] = fun;}static base* createByString(std::string var){return (CreateList.find(var)->second)();}};#define REGISTER_CLASS(class_name) \Factory::registerClass(#class_name, CREATE_CLASS(CreateClass##class_name))int main(){   REGISTER_CLASS(A);REGISTER_CLASS(B);REGISTER_CLASS(C);base* pA = Factory::createByString("A");base* pB = Factory::createByString("B");base* pC = Factory::createByString("C");system("pause");return 0;} 

原创粉丝点击