突发奇想写了这个非常简单,但是很有用的东西
:
需要 boost 库支持
文件名: Runtimeclass.hpp
需要 boost 库支持
文件名: Runtimeclass.hpp
#include <map>
#include <string>
#include <boost/function.hpp>
using std::string;
// Write by Jadedrip (Jadedrip@gmail.com)
class RuntimeClassFactory {
private:
typedef boost::function<void*()> RUNTIME_CREATE_REF;
protected:
typedef std::map< string, RUNTIME_CREATE_REF > class_map;
static class_map& cmap(){
static class_map m_map;
return m_map;
}
public:
static void register_class( string name, RUNTIME_CREATE_REF p ){ (cmap())[name]=p; }
static void* create( string name ){
if( cmap().find( name )!=cmap().end() )
return (cmap()[name])();
else
return NULL;
}
};
template<typename T>
struct RegisterClassHelper
{
RegisterClassHelper(const string class_name){
RuntimeClassFactory::register_class( class_name, &RegisterClassHelper<T>::create_object
);
delete this;
}
static void* create_object(){ return new T; }
};
#define REGISTER_CLASS(X) static RegisterClassHelper<X> *__class_help=new RegisterClassHelper<X>(_T(#X));
#define REGISTER_CLASS_BY_NAME(X,CLASSNAME) static RegisterClassHelper<X> *__class_help=new RegisterClassHelper<X>(_T(CLASSNAME));
|
===================== 我是分隔线 ==============================
使用相当简单,定义好类以后, 在类定义的后面加上 REGISTER_CLASS(X)然后就可以用
RuntimeClassFactory::create("classname");来创建类了, 返回值是 void* 类型的指针。
比如
class A{
...
};
REGISTER_CLASS(A)
void main()
{
string class_name="A";
A* a=(A*)RuntimeClassFactory::create(class_name);
}
|