函数多个参数的模板

时间:2015-01-25 10:13:22

标签: c++ templates

我试图实现这个目标:

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;

1 个答案:

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