Короткий путь к std:: привязать функцию-член к экземпляру объекта, без параметров привязки
У меня есть функция-член с несколькими аргументами. Я хотел бы привязать его к конкретному экземпляру объекта и передать его другой функции. Я могу сделать это с помощью заполнителей:
// actualInstance is a MyClass*
auto callback = bind(&MyClass::myFunction, actualInstance, _1, _2, _3);
Но это немного неуклюжие - например, когда число параметров меняется, мне также нужно изменить все вызовы связывания. Но, кроме того, довольно утомительно вводить все заполнители, когда все, что мне действительно нужно, - это удобно создать "указатель на функцию", включающий ссылку на объект.
Итак, что бы я хотел сделать, это что-то вроде:
auto callback = objectBind(&MyClass::myFunction, actualInstance);
Кто-нибудь знает какой-нибудь хороший способ сделать это?
Ответы
Ответ 1
Я думаю, что это сработает:
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...); };
}