函数多参数模板
Template for a function multiple arguments
我正在努力实现这一点:
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
可以访问它们。 触发器的实现如何访问这些参数?
编辑:
我的新class
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;
我认为你的语法有误。首先,模板应该是 class EventDispatcher
,而不是个别函数。二、...
错位:
template <typename... T>
class EventDispatcher {
public:
void on(std::string eventID, void (*f)(T...) callback);
void trigger(std::string eventID, T... args);
};
如果您将成员函数作为模板,而不是 class,那么一个和另一个的参数之间将没有联系。我不认为那是明智的。
一个实现可能是这样的:
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...);
}
我正在努力实现这一点:
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
可以访问它们。 触发器的实现如何访问这些参数?
编辑:
我的新class
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;
我认为你的语法有误。首先,模板应该是 class EventDispatcher
,而不是个别函数。二、...
错位:
template <typename... T>
class EventDispatcher {
public:
void on(std::string eventID, void (*f)(T...) callback);
void trigger(std::string eventID, T... args);
};
如果您将成员函数作为模板,而不是 class,那么一个和另一个的参数之间将没有联系。我不认为那是明智的。
一个实现可能是这样的:
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...);
}