#ifndef _DYN_CREATE_H_
#define _DYN_CREATE_H_
using namespace std;
#include "map"
#include <string>
typedef void* (*FUNC)(void);
class DynamicCreateObj
{
public:
static void* CreateObject(const string& objName)
{
map<string,FUNC>::const_iterator It;
It = mapClass.find(objName);
if (It == mapClass.end())
{
return 0;
}
return It->second();
}
static void AddClass(const string& objName, FUNC fun)
{
mapClass[objName] = fun;
}
private:
static map<string, FUNC> mapClass;
};
__declspec(selectany) map<string, FUNC> DynamicCreateObj::mapClass;
class RegisterClass
{
public:
RegisterClass(const string& objName, FUNC fun)
{
DynamicCreateObj::AddClass(objName,fun);
}
};
#define REGISTER_CLASS(class_name) \
class class_name##Register \
{ \
public: \
static void* NewInstance() \
{ \
return new class_name; \
} \
private: \
static RegisterClass reg; \
}; \
RegisterClass class_name##Register::reg(#class_name,class_name##Register::NewInstance);
#endif //_DYN_CREATE_H_