Я попытался создать шаблон функции, который вызывал бы функцию-член в объекте, указанном параметром шаблона, но мне не удалось.Теперь у меня есть несколько функций, которые отличаются очень незначительно:
static void resize_callback(raw_resource* ptr, int width, int height)
{
owner* instance = static_cast<owner*>(get_owner(ptr));
assert(instance != nullptr);
instance->on_resize(width, height);
}
static void focus_callback(raw_resource* ptr, bool state)
{
owner* instance = static_cast<owner*>(get_owner(ptr));
assert(instance != nullptr);
instance->on_focus(state);
}
static void other_callback(raw_resource* ptr, type1 arg1, type2 arg2, type3 arg3)
{
owner* instance = static_cast<owner*>(get_owner(ptr));
assert(instance != nullptr);
instance->on_other(arg1, arg2, arg3);
}
...
Каждая raw_resource
имеет ровно одну owner
, где owner
- это обертка вокруг raw_resource
.Обратные вызовы поступают в низкоуровневую библиотеку C, которая не знает о owner
с, а только о raw_resource
с, поэтому они должны принять raw_resource*
, чтобы указатель на них (обратные вызовы) имел соответствующий тип,Операции в обратных вызовах должны использовать объекты owner
, поэтому они извлекают их через get_owner()
.
Как я могу сделать из них шаблон общей функции, который бы избежал дублирования кода? Мне нужно, чтобы экземпляры этого шаблона были конвертируемыми в соответствующие указатели функций , которые будут совместимы с их текущими сигнатурами, чтобы их можно было передавать в низкоуровневую библиотеку C.