如何在std :: bind周围创建包装器

时间:2013-11-24 17:26:58

标签: c++ c++11 function-pointers

我有一个函数对象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 *)>')

我不明白错误。

1 个答案:

答案 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);
  }