Я пытаюсь заменить все макросы в моем коде шаблонами. У меня есть макрос, который связывает this
в качестве первого аргумента функции, чтобы функцию-член можно было использовать в статическом контексте. Как я могу добиться этого с помощью шаблонов?
Я хотел бы эту функциональность:
#define BIND_EVENT_FN(func) std::bind(&func, this, std::placeholders::_1)
Или с лямбдами:
#define BIND_EVENT_FN(func) [this](Event& e){ return func(e); }
Что-то вроде этого, ноочевидно, не совсем так, потому что это не компилируется:
template<class T>
auto bind_event_fn(T& func)
{
return [this](Event&& e){ return func(e); };
}
Минимальный рабочий пример ниже, можно ли заменить макрос?
#include <functional>
#include <iostream>
#define LAMBDA_BIND_FN(fn) [this](const int& event) { return fn(event); }
#define BASIC_BIND_FN(func) std::bind(&func, this, std::placeholders::_1)
void run_in_static_context(std::function<void(const int&)> fn)
{
fn(42);
}
class A {
public:
A()
{
run_in_static_context(LAMBDA_BIND_FN(A::member_fn));
}
private:
void member_fn(const int& event)
{
std::cout << "Event: " << event << std::endl;
}
};
int main()
{
A();
}