Скажем, я использую C API, который позволяет вам регистрировать обратные вызовы, которые принимают закрытие void*
:
void register_callback(void (*func)(void*), void *closure);
В С++ хорошо иметь более сильные типы, чем void*
, поэтому я хочу создать оболочку, которая позволяет мне регистрировать строго типизированные обратные вызовы С++:
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()
работать выше, сохраняя при этом характеристику производительности с нулевой нагрузкой? Я хочу что-то, что будет работать на С++ 98.