オブザーバーパターンのテンプレート基本クラスを実装しました。
template<class T>
class ActionListener
{
public:
ActionListener(void);
virtual ~ActionListener(void);
void registerListener(T* listener);
void unregisterListener(T* listener);
template<typename Signal>
void emit(Signal signal);
template<typename Signal, typename Parameter>
void emit(Signal signal, const Parameter& parameter);
template<typename Signal, typename Parameter1, typename Parameter2>
void emit(Signal signal,
const Parameter1& parameter1,
const Parameter2& parameter2);
private:
std::vector<T*> mListenerList;
};
class IEventListener
{
public:
virtual void messageArrived( Message* message);
virtual void messageArrived(ClientHandle* handle, Message* message);
};
私はこのようなクラスを使用しています
emit(&IEventListener::messageArrived, message);
emit(&IEventListener::messageArrived, mHandle, message);
ここでの問題は、コンパイラがテンプレートパラメータを推測できず、テンプレートパラメータを明示的に指定できなかったことです。
誰かがアイデアを持っていますか?
編集:ここでの問題は、テンプレートパラメータを使用した関数呼び出しのオーバーライドです。「Emit」関数は他の関数タイプで正しく機能します。
このパターンの使用法は
class SampleClass : public ActionListener<IEventListener>
{
//some stuff here
//this class is observing events of IEventListener
}
ちなみにこれはC++です。