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

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

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

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

Так что я хотел бы иметь возможность сделать что-то вроде:

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

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

12

Решение

Я думаю, что это будет работать:

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...); };
}
11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]