假设我正在使用 C API,它可以让您注册回调函数void*
关闭:
void register_callback(void (*func)(void*), void *closure);
在 C++ 中,拥有比void*
所以我想创建一个包装器,让我注册强类型的 C++ 回调:
template <typename T, void F(T*)>
void CallbackWrapper(void *p) {
return F(static_cast<T*>(p));
}
void MyCallback(int* param) {}
void f(void *closure) {
register_callback(CallbackWrapper<int, MyCallback>, closure);
}
这工作正常。该解决方案的一个很好的特性是它可以将我的回调内联到包装器中,因此该包装方案的开销为零。我认为这是一个要求。
但如果我能让 API 看起来更像这样就好了:
void f2() {
RegisterCallback(MyCallback, closure);
}
我希望能够通过推断模板参数来实现上述目的。但我不太清楚如何让它发挥作用。到目前为止我的尝试是:
template <typename T>
void RegisterCallback(void (*f)(T*), T* closure) {
register_callback(CallbackWrapper<T, f>, closure);
}
但这行不通。任何人都有一个神奇的咒语,可以使f2()
工作上面,同时保留零开销性能特征?我想要一些可以在 C++98 中工作的东西。