Tag: c ++ 98

用于包装带有void *参数的C回调的模板魔术?

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