Подтвердить что ты не робот

Короткий путь к std:: привязать функцию-член к экземпляру объекта, без параметров привязки

У меня есть функция-член с несколькими аргументами. Я хотел бы привязать его к конкретному экземпляру объекта и передать его другой функции. Я могу сделать это с помощью заполнителей:

// actualInstance is a MyClass*
auto callback = bind(&MyClass::myFunction, actualInstance, _1, _2, _3);

Но это немного неуклюжие - например, когда число параметров меняется, мне также нужно изменить все вызовы связывания. Но, кроме того, довольно утомительно вводить все заполнители, когда все, что мне действительно нужно, - это удобно создать "указатель на функцию", включающий ссылку на объект.

Итак, что бы я хотел сделать, это что-то вроде:

auto callback = objectBind(&MyClass::myFunction, actualInstance);

Кто-нибудь знает какой-нибудь хороший способ сделать это?

4b9b3361

Ответ 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...); };
}