c++组合对象管理(二)

2014-11-23 22:30:48 ? 作者: ? 浏览: 13
(concrete_entity); } } return ret; } private: std::map m_entity_map; bool m_in_iteration; }; class KEY_UINT32 : protected Entity_Map { protected: typedef Entity_Map Super; KEY_UINT32() { } bool add_entity(Entity *entity) { return Super::add_entity(entity->id(), entity); } void delete_entity(Entity *entity) { Super::delete_entity(entity->id()); } }; class KEY_STRING : protected Entity_Map { protected: typedef Entity_Map Super; KEY_STRING() { } bool add_entity(Entity *entity) { return Super::add_entity(entity->name(), entity); } void delete_entity(Entity *entity) { Super::delete_entity(entity->name()); } }; //占位 template class KEY_NONE { protected: KEY_NONE() { } void clear() { } bool add_entity(Entity *entity) { return true; } void delete_entity(Entity *entity) { } }; //提取基类的trait template struct Get_Super { }; template<> struct Get_Super { typedef KEY_UINT32 Super; }; template<> struct Get_Super { typedef KEY_STRING Super; }; template > class Entity_Manager : private Super1, private Super2 { protected: Entity_Manager() { } bool add_entity(Entity *entity) { if(!Super1::add_entity(entity)) { return false; } if(!Super2::add_entity(entity)) { Super1::delete_entity(entity); return false; } return true; } bool delete_if(Entity_Exec &cb) { std::vector del_vec; if(!Super1::delete_if(cb, del_vec)) { return false; } for(std::vector::iterator iter = del_vec.begin(); iter != del_vec.end(); ++iter) { Concrete_Entity *concrete_entity = static_cast(concrete_entity); delete_entity(concrete_entity); cb.exec(concrete_entity); } return true; } void delete_all(Entity_Exec &cb) { exec_all(cb); clear(); } template Concrete_Entity* get_entity(Key key) const { return static_cast(Get_Super::Super::get_entity(key)); } void delete_entity(Entity *entity) { Super1::delete_entity(entity); Super2::delete_entity(entity); } public: uint32 size() const { return Super1::size(); } bool empty() const { return Super1::empty(); } void clear() { Super1::clear(); Super2::clear(); } bool exec_until(Entity_Exec &cb) { return Super1::exec_until(cb); } bool exec_if(Entity_Exec &cb) { return Super1::exec_if(cb); } void exec_all(Entity_Exec &cb) { Super1::exec_all(cb); } };

#endif
我实现的Entity_Manager支持两种类型建立索引来查找被管理的对象,一种按名字查找,一种按数字id查找,具体功能模块可以根据需要以不同的模板参数来继承Entity_Manager来管理自己的对象。这里简单给出一个例子来讲解如何使用Entity_Manager类,假如项目中有很多的任务,需要建立一个任务管理器来管理任务,我们将任务抽象成Task类,任务管理器抽象为Task_Manager类,如果我希望按id来管理我的任务,Task_Manager类定义如下:
class Task_Manager : public Entity_Manager  
{  
public:  
    Task* get_task(uint32 task_id) const  
    {  
        return get_entity(task_id);  
    }  
      
    bool add_task(const Task *task)  
    {  
        return add_entity(task);  
    }  
      
    void delete_task(const Task *task)  
    {   
        delete_entity(task);  
    }  
      
    void print_all_task_name()  
    {  
        struct CB : Entity_Exec  
        {  
            bool exec(Task *task)  
            {  
                print(task->name());  
            }  
        }  
          
        CB cb;  
        exec_all(cb);  
    }  
};  

只要继承Entity_Manager类后,Task_Manager类就具备了管理多个Task类的能力,支持对
-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: