リスナーを追加する関数を定義するイベント ソース基本クラスがあり、あいまいさを解決するためにテンプレート引数を使用しようとしています。しかし、それは機能していないようです-常に最初の基本クラスの関数を使用し、テンプレートパラメーターが一致しないと不平を言います:
#include <type_traits>
template<class Event>
class EventSource
{
public:
class Listener
{
public:
virtual void handle( const Event& e ) = 0;
};
template<class EventType>
typename std::enable_if<std::is_same<Event, EventType>::value, void>::type
addListener( Listener* ptr );
};
class Event1 {};
class Event2 {};
class MultiListener : public EventSource<Event1>::Listener, public EventSource<Event2>::Listener
{
public:
void handle( const Event1& e );
void handle( const Event2& e );
};
class MultiSource : public EventSource<Event1>, public EventSource<Event2>
{
public:
void addMultiListener( MultiListener* ptr )
{
addListener<Event1>( ptr );
addListener<Event2>( ptr ); // this line causes error
}
};
これが SFINAE に該当しないのはなぜですか?
基本クラスを明示的に指定できることはわかっていますが、テンプレートは よりもはるかに見栄えがしますEventSource<Event1>::addListener(...)
。