【发布时间】:2013-11-13 07:32:54
【问题描述】:
我不确定模板类型扣除是否会在此处加入竞争。但让我解释一下。
我有一个模板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>和EventProducer<MouseButtonEvent>? - 我能否在不明确指定基数的情况下帮助编译器决定调用哪个?
- 这个调用也发生了同样的情况:
hellRaiserObject->Subscribe(mouseCallback);。我知道在这里推断类型可能有点困难,但mouseCallback有一个特定的签名,可以与模板专业化进行比较,而且我认为它只适合其中一个。
以防万一,事件定义如下:class MouseMoveEvent: public Event<MouseMoveEvent>,基本模板所在的位置
template <typename TEventArgs>
class Event
{
public:
typedef TEventArgs EventArgs;
typedef void HandlerSignature(TEventArgs&);
// ...
};
非常感谢您的帮助。
【问题讨论】:
标签: c++ templates c++11 template-meta-programming