我有一个函数对象typedef std::function<bool(Event*)> 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);
}
用法将是:
Handler f = MemFn(&LevelSystem::switchLevel);
使用此功能时出错:
No viable conversion from
'__bind<bool(LevelSystem::*&)(Event *), System *,std::__1::placeholders::__ph<1> &>' to
'Handler' (aka 'function<bool(Event *)>')
我不明白错误。
答案 0 :(得分:6)
您正在尝试创建一个绑定表达式,该表达式将在bool (LevelSystem::*)(Event*)
对象上调用System
函数,这是不可能的。
您需要将正确的this
动态类型绑定到该函数,因为您的注释表明您现在已将this
指针传递给MemFn
。
如果你总是要将指向成员函数的指针传递给MemFn
,那么通过rvalue-reference传递它是没有意义的,你也可以将指针传递给成员。这样做可以推断出类类型,因此您可以将this
强制转换为该类型:
template<typename Ret, typename Class, typename Param>
inline Handler MemFn(Ret (Class::*f)(Param)) {
return std::bind(f, static_cast<Class*>(this), std::placeholders::_1);
}