C++ 如何围绕std::bind创建包装器

C++ 如何围绕std::bind创建包装器,c++,c++11,function-pointers,C++,C++11,Function Pointers,我有一个函数对象typedef std::function Handler。成员函数始终被分配给此对象。因此,我使用std::bind来实现这一点 Handler f = std::bind(&LevelSystem::switchLevel, this, std::placeholders::_1); f(new Event("test")); 上面的代码按预期工作,但我想将std::bind包装在一个助手函数中,以获得更干净的代码。这就是我想到的 template<clas

我有一个函数对象
typedef std::function Handler
。成员函数始终被分配给此对象。因此,我使用
std::bind
来实现这一点

Handler f = std::bind(&LevelSystem::switchLevel, this, std::placeholders::_1);
f(new Event("test"));
上面的代码按预期工作,但我想将
std::bind
包装在一个助手函数中,以获得更干净的代码。这就是我想到的

 template<class Func> inline Handler MemFn(Func &&f) {
     return std::bind(f, this, std::placeholders::_1);
  }
使用此函数时,我遇到一个错误:

No viable conversion from
'__bind<bool(LevelSystem::*&)(Event *), System *,std::__1::placeholders::__ph<1> &>' to
'Handler' (aka 'function<bool(Event *)>')
没有从
“绑定”到
“处理程序”(又名“函数”)

我不理解错误。

您正在尝试创建一个绑定表达式,该表达式将调用
系统
对象上的
bool(LevelSystem::*)(Event*)
函数,这是不可能的

您需要将
this
的正确动态类型绑定到函数,因为您的注释表明您现在已经将
this
指针传递到
MemFn

如果您总是要将指向成员函数的指针传递给
MemFn
,那么通过右值引用传递它是没有意义的,您不妨将指针传递给成员。这样做允许您推断类类型,这样您就可以将
this
转换为该类型:

模板
内联处理程序MemFn(Ret(类::*f)(参数)){
返回std::bind(f,static_cast(this),std::占位符::_1);
}

您试图创建一个绑定表达式,该表达式将调用
系统
对象上的
bool(LevelSystem::*)(Event*)
函数,这是不可能的

您需要将
this
的正确动态类型绑定到函数,因为您的注释表明您现在已经将
this
指针传递到
MemFn

如果您总是要将指向成员函数的指针传递给
MemFn
,那么通过右值引用传递它是没有意义的,您不妨将指针传递给成员。这样做允许您推断类类型,这样您就可以将
this
转换为该类型:

模板
内联处理程序MemFn(Ret(类::*f)(参数)){
返回std::bind(f,static_cast(this),std::占位符::_1);
}

这个
MemFn
中的上下文是什么?它是系统,是LevelSystem的基类。我更改代码以接受LevelSystem;仍然不起作用我通过将其作为一个单独的参数传递来修复了这个问题:
模板内联处理程序MemFn(Func&&f,Sys*system){…}
这个
MemFn
中的上下文是什么?它是系统,是LevelSystem的基类。我更改代码以接受LevelSystem;仍然不起作用我通过将此作为单独的参数传递来修复此问题:
模板内联处理程序MemFn(Func&&f,Sys*system){…}
谢谢!C++让我越来越惊奇:一件事。这不应该是静态的吗?
谢谢!C++让我越来越惊奇:一件事。它不应该是静态的吗
No viable conversion from
'__bind<bool(LevelSystem::*&)(Event *), System *,std::__1::placeholders::__ph<1> &>' to
'Handler' (aka 'function<bool(Event *)>')