我试图用C / C ++实现一个类项目的游戏引擎。我决定使用the acyclic visitor pattern在子系统之间发送事件,因为我需要能够在引擎之外扩展事件和子系统集。我想为这部分内容使用模板,因为很多代码都是相同的,只有不同的类型作为参数。在创建新事件时,我想继承Event
类模板,然后使用子类实例化它:
// Event.h
template<typename T>
class Event {
static_assert(std::is_base_of<Event, T>::value);
public:
void Event::accept(EventListenerBase& el){
if (EventListener<T>* eventListener = dynamic_cast<EventListener<T>*>(*el)){
eventListner->accept(this);
}
}
};
// MyNewEvent.h
class MyNewEvent : public Event<MyNewEvent> {
}
这是一个可行的解决方案吗?
答案 0 :(得分:2)
是的,并且实际上有这个模式的名称:奇怪的重复模板模式(或CRTP)。
顺便说一下。这不是专门化模板,而是实例化它。专业化将是
template<>
class Event<MyNewEvent> { /* ... */ };