У меня есть функция-член с несколькими аргументами. Я хотел бы связать его с конкретным экземпляром объекта и передать его другой функции. Я могу сделать это с заполнителями:
// actualInstance is a MyClass*
auto callback = bind(&MyClass::myFunction, actualInstance, _1, _2, _3);
Но это немного неуклюже — например, когда меняется количество параметров, мне приходится также изменять все вызовы связывания. Но кроме того, набирать все заполнители довольно утомительно, когда все, что мне действительно нужно, — это удобно создать «указатель на функцию», включая ссылку на объект.
Так что я хотел бы иметь возможность сделать что-то вроде:
auto callback = objectBind(&MyClass::myFunction, actualInstance);
Кто-нибудь знает какой-нибудь хороший способ сделать это?
Я думаю, что это будет работать:
template<typename R, typename C, typename... Args>
std::function<R(Args...)> objectBind(R (C::* func)(Args...), C& instance) {
return [=](Args... args){ return (instance.*func)(args...); };
}
затем:
auto callback = objectBind(&MyClass::myFunction, actualInstance);
примечание: вам понадобятся перегрузки для обработки CV-квалифицированных функций-членов. то есть:
template<typename R, typename C, typename... Args>
std::function<R(Args...)> objectBind(R (C::* func)(Args...) const, C const& instance) {
return [=](Args... args){ return (instance.*func)(args...); };
}
Других решений пока нет …