2017-01-05 9 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)。

およびbtw。これはテンプレートを特化するのではなく、インスタンス化します。特殊化は

template<> 
class Event<MyNewEvent> { /* ... */ }; 
関連する問題