从类型列表

时间:2017-02-15 16:01:53

标签: c++ templates inheritance typelist

我正在经历"现代C ++设计"并且我遇到了第3章末尾解释的GenLinearHierarchy问题。

由于没有提供如何调用函数和处理生成的层次结构的代码,我无法判断我所写的内容是否正确。这本书简化了这项技术的使用,因此很难说清楚。

我查看了Loki库中的AbstractFactory示例,并将其改为与我想要的一起工作,但我感觉我在某个地方采取了额外的步骤。

GenScatterHierarchy和GenLinearHierarchy与定义的here相同

我的代码:

template<class T>
class AbstractCollisionEvent
{
public:
    virtual void Collision(int id, T& obj) = 0;
    virtual ~AbstractCollisionEvent() {};
};


template <class T, class Base>
class CollisionEventImpl : public Base
{
    typedef typename Base::ProductList BaseProductList;

protected:
    typedef typename BaseProductList::Tail ProductList;

public:
    typedef typename BaseProductList::Head AbstractProduct;
    void Collision(int id, AbstractProduct& obj)
    {
        obj.Collided(id, Chapter2::Type2Type<AbstractProduct>());
    }
};

template
<
    class TList,
    template <class> class Unit = AbstractCollisionEvent
>
class CollisionHandlerScatter : public HierarchyGenerators::GenScatterHierarchy<TList, Unit>
{
public:
    typedef TList ProductList;

    template<class O>
    void OnCollide(O& obj, int id)
    {
        Unit<O>& unit = *this;
        unit.Collided(id, obj);
    }
    virtual ~CollisionHandlerScatter() {}
};

template
<
    class AbstractHandler,
    template <class, class> class Handler,
    class TList
>
class ConcreteCollisionHandler : public  HierarchyGenerators::GenLinearHierarchy<TList, Handler, AbstractHandler>
{

};

class Explode
{
public:
    void Collided(int id, Chapter2::Type2Type<Explode>)
    {
        std::cout << "Exploded!";
    }
};

class Spawn
{
public:
    void Collided(int id, Chapter2::Type2Type<Spawn>)
    {
        std::cout << "Spawned!";
    }
};

class Heal
{
public:
    void Collided(int id, Chapter2::Type2Type<Heal>)
    {
        std::cout << "Heal!";
    }
};

typedef TYPELIST_3(Spawn, Explode, Heal) colliderTL;
typedef CollisionHandlerScatter<colliderTL> CHS;
typedef ConcreteCollisionHandler<CHS, CollisionEventImpl, colliderTL> CCH;


CCH cch;
Spawn s;
Heal h;
cch.OnCollide(s, 1);
cch.OnCollide(h, 1);

此代码有效。但我觉得&#34; AbstractCollisionEvent&#34;和&#34; CollisionEventImpl&#34;只是无用的层,或至少它是如何看待书的解释方式。我没有能够实现我想要的行为,没有这两个,我想知道是否有一个或者是否有办法改善我的东西。

0 个答案:

没有答案