【发布时间】:2009-09-23 13:56:02
【问题描述】:
我为观察者模式实现了一个模板基类,
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++。
【问题讨论】:
-
为什么不能明确给出模板参数类型?
-
"...编译器无法推导出模板参数..." 错误信息是什么?
-
我无法理解您要做什么。请添加更多解释。您省略了 Message 的定义,也没有提到 ActionListener 应该如何与 IEventListener 交互。您的代码片段并不完全不言自明。我认为您尝试在这里模拟 Java 风格的泛型,其中 T 是派生自 IEventListener 的类类型。但我不确定。
标签: c++ design-patterns inheritance templates function-pointers