我正在经历"现代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;只是无用的层,或至少它是如何看待书的解释方式。我没有能够实现我想要的行为,没有这两个,我想知道是否有一个或者是否有办法改善我的东西。