繁体   English   中英

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

[英]how to create wrapper around std::bind

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

我不明白这个错误。

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

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

如果您总是要将指向成员函数的指针传递给MemFn那么通过右值引用传递它是没有意义的,您不妨只传递指向成员的指针。 这样做,可以让你推断类的类型,所以你可以再投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);
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM