使用 enable_if 解决多重继承歧义
Resolving multiple inheritance ambiguity with enable_if
我有一个事件源库 class,它定义了一个添加侦听器的函数,我正在尝试使用模板参数来解决歧义。但这似乎不起作用 - 它总是使用第一个基础 class 的函数,然后抱怨模板参数不匹配:
#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?
我知道我可以明确指定基数 class,但模板看起来比 EventSource<Event1>::addListener(...)
好得多。
这两行都会导致错误,因为名称查找不明确(在检查重载是否可行之前)。
您可以使用 using
解决问题
class MultiSource : public EventSource<Event1>, public EventSource<Event2>
{
using EventSource<Event1>::addListener;
using EventSource<Event2>::addListener;
public:
void addMultiListener( MultiListener* ptr )
{
addListener<Event1>( ptr );
addListener<Event2>( ptr );
}
};
我有一个事件源库 class,它定义了一个添加侦听器的函数,我正在尝试使用模板参数来解决歧义。但这似乎不起作用 - 它总是使用第一个基础 class 的函数,然后抱怨模板参数不匹配:
#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?
我知道我可以明确指定基数 class,但模板看起来比 EventSource<Event1>::addListener(...)
好得多。
这两行都会导致错误,因为名称查找不明确(在检查重载是否可行之前)。
您可以使用 using
class MultiSource : public EventSource<Event1>, public EventSource<Event2>
{
using EventSource<Event1>::addListener;
using EventSource<Event2>::addListener;
public:
void addMultiListener( MultiListener* ptr )
{
addListener<Event1>( ptr );
addListener<Event2>( ptr );
}
};