我正在尝试编写一个简单的调度程序,用户代码可以将回调附加到它.每个事件都有一个已知的签名,用户代码需要使用正确的数字和参数类型调用dispatch.这由可变参数管理.但是,freestandingInt不被接受,因为向量不是正确的类型.如何使它通用?
遵循一个最小的例子
void freestanding() {
std::cout << "freestanding" << std::endl;
}
void freestandingInt(int iArg) {
std::cout << "freestandingInt " << iArg << std::endl;
}
struct Dispatcher {
typedef struct Event_ {
std::vector<std::function<void()> > listeners;
} Event;
template<class... Args>
void dispatch(int eventNr, Args&&... args) {
for (auto listener: events[eventNr].listeners) {
std::function<void()> f(std::bind(listener, std::forward<Args>(args)...));
f();
}
}
std::map<int, Event> events;
};
int main (int argc, char **argv) {
Dispatcher disp;
disp.events[0].listeners.push_back(freestanding);
disp.dispatch(0); // OK
// error here
//disp.events[1].listeners.push_back(freestandingInt);
}
Run Code Online (Sandbox Code Playgroud)