我不确定模板类型扣除是否会在此处加入竞争。但让我解释一下。
我有一个模板class EventProducer
,引发事件的对象从该模板派生一次,每个事件类型一次,这样我就可以拥有这样的东西:class HellRaiser: public EventProducer<MouseMoveEvent>, public EventProducer<MouseButtonEvent>
. 这似乎工作得很好,除了EventProducer
在通过派生类的对象调用时必须使用基类型限定调用。但是编译器不应该自动推导出基数EventProducer
吗?
这是定义:
template <typename TEvent>
class EventProducer
{
public:
typedef function<typename TEvent::HandlerSignature> HandlerFunction;
// Methods.
connection Subscribe(const HandlerFunction& callback);
void Trigger(TEvent& event);
protected:
// ...
};
在TEvent::HandlerSignature
事件类中定义的位置。
- 为什么这个调用模棱两可:
hellRaiserObject->Trigger(MouseMoveEvent(11, -4));
假设对象派生自EventProducer<MouseMoveEvent>
andEventProducer<MouseButtonEvent>
? - 我可以做些什么来帮助编译器决定调用哪个,而不明确指定基数吗?
- 这个调用也会发生同样的情况:
hellRaiserObject->Subscribe(mouseCallback);
. 我知道在这里推断类型可能有点困难,但mouseCallback
有一个可以与模板专业化进行比较的特定签名,我认为它只适合其中一个。
以防万一它有所作为,事件定义如下:class MouseMoveEvent: public Event<MouseMoveEvent>
,其中基本模板是
template <typename TEventArgs>
class Event
{
public:
typedef TEventArgs EventArgs;
typedef void HandlerSignature(TEventArgs&);
// ...
};
非常感谢帮助。