2017-01-05 64 views
1

我想在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

'這可能嗎?':你試過了嗎?什麼告訴你編譯器? – jpo38

+0

也想到提供[mcve](http://stackoverflow.com/help/mcve),它很難預測是否'EventListener '已經重載轉換爲'T *'操作符或者它是你的代碼的錯誤。 .. –

回答

2

是的,實際上有一個這種模式的名稱:奇怪的循環模板模式(或CRTP)。

而順便說一句。這不是專門化模板,而是實例化它。專業化將是

template<> 
class Event<MyNewEvent> { /* ... */ };