Вопрос отсюда. Есть такой вот код, который работает:
class Base {
protected:
template <class T, class... Args>
std::function<void(Args...)> bind_this_(void (T::*f)(Args...))
{
return [this, f](Args&&... args) { (static_cast<T&>(*this).*f)(std::forward<Args>(args)...); };
}
};
class A : public Base {
void foo(int arg1, int& arg2, std::string& str) {}
public:
std::function<void (int, int&, std::string&)> get_foo_functor() { return bind_this_(&A::foo); }
};
A::get_foo_functor() привязывает к A::foo() указатель на экземпляр A (который неявный this) и возвращает обертку, которую можно использовать как функциональный объект с аргументами, такими же как у A::foo().
Вопрос 1: можно ли как-то обойтись без лямбды? Вопрос 2: как сделать шаблонный класс X с оператором operator()(), который, будучи инстанцироваьным с нужными параметрами, возвращал бы такой же функтор. Типа вот такого:
A a;
X< ... > foo_functor_producer(/* например */ &a, &A::foo);
auto ff = foo_functor_producer(); //< возвращает std::function<void (int, int&, std::string&)>