Что ж, следите за будущими людьми, вот приятный ответ.Мне потребовалось время, чтобы разработать его.Я не знаю, идеально ли это, но выглядит хорошо для меня;
Первое, что мы сделаем, это создадим структуру "MemberLambda", мы будем использовать функцию пакета параметров, которая идеально подходит для того, что нам нужно:
template <class Parent,class Return, class...Params>
struct MemberLambda
{
Parent* self; // pointer to self
void (*lambda)(Parent * self,Params...);//the lambda
MemberLambda() = default;//Constructor
MemberLambda(Parent* self, void(*lambda)(Parent* self,Params...)) :
self(self),lambda(lambda) {};//Constructor
Return operator()(Params... p) const { return lambda(self,p...); };
void operator=(void (*lambda)(Parent* self, Params...)) {
this->lambda = lambda;
}
};
Теперь мы можем его использовать.
Использование в классе
Вот пример класса с именем A:
class A {
public:
int someMember;
MemberLambda<A, void, int, int> func =
MemberLambda<A, void, int, int>(this, nullptr);
};
* Обратите внимание, что в приведенном выше примере мы устанавливаем лямбду на значение nullptr, но вы можете установить лямбду на лямбда-выражение.
Я решил, что лямбда будет членом "A", возьмите два типа int и верните void.Измените его для своих нужд.
Использование пользователем
Для пользователя легко использовать, например:
A a;
a.someMember = 3;
a.func = [](A* self, int a, int b){ std::cout << self->someMember + a + b; };
a.func(5,5);
Будет выводить 13, которые3 + 5 + 5.
Работает хорошо.