c++组合对象管理(二)
(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类的能力,支持对
| 评论 |
|
|