我试图实现这个目标:
class EventDispatcher {
public:
template <typename T...> void on(std::string eventID, void(*f)(T...) callback);
template <typename T...> void trigger(std::string eventID, T&... args);
}
//...
void doSomething(int a, float b, SomeObject c){...}
// ...
eventDispatcher.on("someEvent", doSomething);
// ...
eventDispatcher.trigger("someEvent", a, b, c);
所以我希望T成为多个参数,而eventDispatcher#trigger
可以访问它们。 触发器的实现如何访问这些参数?
编辑:
我的新班级
template <typename T...> class EventDispatcher {
public:
EventDispatcher(std::string eventID);
void on(std::function<void(T...)> callback);
void trigger(T&... args);
};
template<typename T...> void registerListener(std::string eventID, std::function<void(T...)> callback);
template<typename T...> void invokeListener(std::string eventID, T.. args);
std::vector<EventDispatcher<>> dispatchers;
答案 0 :(得分:2)
我认为你的语法错了。首先,模板应该是类EventDispatcher
,而不是单个函数。其次,...
放错地方了:
template <typename... T>
class EventDispatcher {
public:
void on(std::string eventID, void (*f)(T...) callback);
void trigger(std::string eventID, T... args);
};
如果将成员函数作为模板而不是类,那么在一个参数和另一个参数之间将没有连接。我认为这不会是明智的。
实现可能是这样的:
private:
std::vector<void (*f)(T...)> m_callbacks;
public:
void on(std::string eventID, void (*f)(T...) callback)
{ //eventID left as an exercise to the reader
m_callbacks.push_back(callback);
}
void trigger(std::string eventID, T... args)
{
for (auto f : m_callbacks)
f(args...);
}