Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19002895
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-05-25 22:15:29

突发奇想写了这个非常简单,但是很有用的东西:
需要 boost 库支持

文件名:  Runtimeclass.hpp

#include 
#include 
#include 
// Write by Jadedrip (Jadedrip@gmail.com)
#ifndef _TSTRDEFINED
    #define _TSTRDEFINED
    #ifdef _UNICODE
        #define tstring std::wstring
    #else
        #define tstring std::string
    #endif
#endif
class RuntimeClassFactory
{
private:
    typedef boost::function RUNTIME_CREATE_REF;
protected:
    typedef std::map< tstring, RUNTIME_CREATE_REF > class_map;
    static class_map& cmap(){
        static class_map m_map;
        return m_map;
    }
public:
    static void register_class( tstring name, RUNTIME_CREATE_REF p ){
        (cmap())[name]=p;
    }
    static void* create( tstring name ){
        if( cmap().find( name )!=cmap().end() )
            return (cmap()[name])();
        else
            return NULL;
    }
};
template
struct ClassObject
{
    ClassObject(const tstring class_name){ RuntimeClassFactory::register_class( class_name, &ClassObject::create_object ); }
    static void* create_object(){ return new T; }
};
#define REGISTER_CLASS(X)      ClassObject __class_help_##X(_T(#X));
#define REGISTER_CLASS_BY_NAME(X,CLASSNAME)        ClassObject __class_help_##X(_T(CLASSNAME));

===================== 我是分隔线 ===============================
使用相当简单,定义好类以后, 在类定义的后面加上 REGISTER_CLASS(X) 然后就可以用
RuntimeClassFactory::create(_T("classname")); 来创建类了, 返回值是 void* 类型的指针。

比如
class A{
    ...
};
REGISTER_CLASS(A)
void main()
{
    tstring class_name=_T("A");
    A* a=(A*)RuntimeClassFactory::create(class_name);
}

阅读(459) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~