#pragma once
#include "shengli_tool/template_map_str.h"
using namespace SHENGLI::TOOLS;
// 用于声明具有动态创建功能的基类
#define DECLARE_DYNCRT_BASE(base) /
public: /
typedef base* (*ClassGen)(); /
static void Register(const char* class_name, ClassGen class_gen) /
{ /
MapStr<base::ClassGen>& class_set = base::get_class_set();/
class_set.Set(class_name, class_gen);/
} /
public:/
static base* Create(const char* class_name) /
{ /
base::ClassGen pfun;/
MapStr<base::ClassGen>& class_set = base::get_class_set();/
if (class_set.Find(class_name, pfun))/
{/
return (pfun)();/
}/
return NULL; /
}/
protected: /
static MapStr<base::ClassGen>& get_class_set()/
{ /
static MapStr<base::ClassGen> class_set; /
return map_set;/
}/
// 用于实现基类
#define IMPLEMENT_DYNCRT_BASE(base)
// 用于声明一个能够被动态创建的类
#define DECLARE_DYNCRT_CLASS(derived, base) /
public: /
struct derived##Register /
{ /
derived##Register() /
{ /
static bool bRegistered = false; /
if(!bRegistered) /
{/
base::Register(#derived, Create); /
bRegistered = true; /
} /
} /
}; /
static base* Create() /
{ /
return new derived; /
}
// 用于实现一个能够被动态创建的类
#define IMPLEMENT_DYNCRT_CLASS(derived) /
static derived::derived##Register derived##_for_registering;