函数多参数模板

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...);
    }