假设我有一个类都实现了相同的接口,也许是为了调度:
class Foo : public IScheduler {
public:
Foo (Descriptor d) : IScheduler (d) {}
/* methods */
};
class Bar : public IScheduler {
public:
Bar (Descriptor d) : IScheduler (d) {}
/* methods */
};
现在假设我有一个 Scheduler 类,您可以要求为给定的描述符启动一个 IScheduler 派生类。如果它已经存在,您将获得对它的引用。如果一个不存在,那么它会创建一个新的。
一个假设的调用类似于:
Foo & foo = scheduler->findOrCreate<Foo>(descriptor);
实现这一点需要一个映射,其键(描述符,RTTI)映射到基类指针。那你就不得不dynamic_cast
。沿着这些思路,我猜:
template<class ItemType>
ItemType & Scheduler::findOrCreate(Descriptor d)
{
auto it = _map.find(SchedulerKey (d, typeid(ItemType)));
if (it == _map.end()) {
ItemType * newItem = new ItemType (d);
_map[SchedulerKey (d, typeid(ItemType))] = newItem;
return *newItem;
}
ItemType * existingItem = dynamic_cast<ItemType>(it->second);
assert(existingItem != nullptr);
return *existingItem;
}
想知道是否有人有办法在不依赖这样的 RTTI 的情况下获得类似的结果。也许每个计划项目类型都可以拥有自己的地图实例?一种设计模式,还是……?