C++ 反射实现

在看《大话设计模式》的策略模式中,使用了反射(用C#实现),在C++中没有反射,需要自己实现。在网上查了下资料,依葫芦画瓢实现了下。但发现在策略模式中实现反射时,需要传参数,于是把网上的实现改写了下,希望能够适用策略模式中的反射,实现按类名调用对应的类。

实现代码如下:

#pragma once
#include "stdafx.h"
#include 
#include 
using namespace std;

typedef void* (*CreateFunc)(void);

class ClassFactory
{
public:
	static void* GetClassByName(std::string strName)
	{
		std::map::const_iterator finder;
		finder = m_clsMap.find(strName);
		if (finder == m_clsMap.end())
		{
			return NULL;
		}
		else
		{
			return finder->second();
		}
	}

	static void RegistClass(std::string strName, CreateFunc method)
	{
		m_clsMap.insert(std::make_pair(strName, method));
	}

private:
	static std::map m_clsMap;
};

std::map ClassFactory::m_clsMap;

class RegistClass
{
public:
	RegistClass(std::string strName, CreateFunc method)
	{
		ClassFactory::RegistClass(strName, method);
	}
};

template
class Register
{
public:
	Register()
	{
		const RegistClass temRc = m_rc;
	}
	static void* CreateInstance()
	{
		return new T(param);
	}

public:
	static const RegistClass m_rc;
};

#define REG_CLASS(class_name, param)\
	char NameArr[] = #class_name;\
	const RegistClass Register::m_rc(NameArr, Register::CreateInstance);

class CG
{
public:
	CG(char* str);

	void Display();
private:
	char* m_str;
};

CG::CG(char* str)
{
	m_str = str;
}

void CG::Display()
{
	printf("%s",m_str);
}

char str[] = "reflection implementation";
REG_CLASS(CG,str);

int _tmain(int argc, _TCHAR* argv[])
{
	CG* tem = (CG*)ClassFactory::GetClassByName("CG");
	tem->Display();
	return 0;
}

希望在C++实现策略模式的过程中用得上!

你可能感兴趣的:(C++)