如何使用模板而不是宏来绑定“ this”?

Gar*_*zet 2 c++ lambda stdbind c++17

我试图用模板替换代码中的所有宏。我有一个宏,它绑定this到函数的第一个参数,以便可以在静态上下文中使用成员函数。如何使用模板来实现?

我想要此功能:

#define BIND_EVENT_FN(func) std::bind(&func, this, std::placeholders::_1)
Run Code Online (Sandbox Code Playgroud)

或使用lambda:

#define BIND_EVENT_FN(func) [this](Event& e){ return func(e); }
Run Code Online (Sandbox Code Playgroud)

与此类似的东西,但显然不完全像这样,因为它不能编译:

template<class T>
auto bind_event_fn(T& func)
{
    return [this](Event&& e){ return func(e); };
}
Run Code Online (Sandbox Code Playgroud)

下面的最小工作示例,是否可以替换宏?

#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();
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 5

我试图用模板替换代码中的所有宏。

你不能 尽管模板可以做很多事情,但是还有很多只能由宏处理的事情。

模板是生成类型,函数或变量的模式。因此,它们必须位于C ++类型,函数或变量的规则之内。一个(非lambda)函数定义不能到达声明它的范围,而只能将其取出。喜欢this的例子。功能范围是隔离的;它不能访问超出其范围的东西(全局变量和类成员之外)。

因此,模板函数也不能做到这一点。两阶段查找确实允许模板根据实例化的位置以某种方式受到可访问名称的影响,但这是非常有限的,在这种情况下完全没有帮助。

您无法this从实例化模板的位置自动导入模板实例化。您可以将this参数作为参数传递给函数,并且它可以在绑定表达式中使用该值,但是模板无法this自行查找。