C ++:实现“ash”实体框架

时间:2013-11-26 15:25:13

标签: c++ entity-framework boost-fusion

我在尝试将Richard Lord's Ash Framework移植到“纯粹的”C ++(MSVC Express 2008)时完全迷失了,或者至少我还没有找到任何类似的实现,  我正在搞乱提升:融合库来实现框架所需的最小化反射要求,但模板元编程对我来说是新的,我遇到了编译错误和耗时的故障测试:( ...

任何人都知道移植框架的可行性或实用性吗?

以Entity类为例,有人可以澄清我如何实现如下结果:

(这是灵活的代码!)

    waitEntity = new Entity( "wait" )
            .add( new WaitForStart( waitView ) )
            .add( new Display( waitView ) )
            .add( new Position( 0, 0, 0 ) );

使用这样的C ++实现吗?

    ...
    namespace bf = boost::fusion;
    namespace bm = boost::mpl;

    template<typename ComponentMap>
    class EntityASH{
    public:
    EntityASH(ComponentMap c)
    :m_components(c){   }
    //"fusion-style" trying to return a new Components template entity for a new component type
    template<typename T>
    EntityASH
    template<typename T>
/*¿Here im absoltely lost
            EntityASH<
            result_of::as_map<
                    typename result_of::push_back<ComponentMap, 
                    fusion::pair<T,T>
                    >::type
                    >
            >*/
    EntityASH *add(){
            typedef bf::pair<T, T> newTentryPair;
            //bf::as_map(bf::push_back<ComponentMap,newTentryPair>(m_components,newTentryPair()));

            return new EntityASH(bf::as_map(bf::push_back<ComponentMap,newTentryPair>(m_components,newTentryPair())));

...

1 个答案:

答案 0 :(得分:0)

C ++中的构造函数无法返回某些内容,因此您必须使用另一种方法来创建实体,createEntity()将返回实体对象的引用或std :: shared_ptr。

我认为在这里使用模板没有任何优势,因为存储对组件的引用对我来说似乎更正确,因为组件是实体的一部分而不属于实体:

std::shared_ptr<Entity> createEntity() {
    return std::make_shared<Entity>();
}

...

std::shared_ptr<Entity> addComponent(ComponentBase comp) {
    mComponents.add(comp);
    return shared_from_this();
}

...

createEntity().add(new Position())
          .add(new Display())
          .add(new Position());

我不明白你为什么要在这里使用模板?您是否希望组件成为实体类型的真实部分?这意味着您无法在运行时以简单的方式添加/删除组件。

我认为在大多数ECS中,实体只是出于可用性原因而存在的容器,并且可以完全由简单的整数ID替换,但是因为它破坏了可用性实体存储对其组件的引用,以便程序员更容易解决。 / p>